MySQL 分组数据

作者: 林石列 分类: 学习札记 发布时间: 2016-04-09 22:01

对于 Excel 数据透视表比较熟悉的人应该知道,透视表最常用的就是对数据进行透视汇总,得到相关的数据就是按照其中一个字段的一个数值进行汇总展示。举个简单的例子:有一份订单详细,记录着几个月以来订单里面每个商品的销售数量和金额。由于每个订单里面的产品是不一样的,需要汇总每个产品的具体销售数据进行汇总,那么就进行分组数据。汇总这些数据在 Excel 上就可以直接使用数据透视表,在数据库使用 SQL 语音就需要用到 Group by 操作符对数据进行分组汇总。

1. 创建分组数据

假如需要对一份销售数据表进行处理,根据商品的编号(Prods_id)汇总出来每一个商品的在一个时间段的销售总数量(Prods_num_sum)。分组数据的原理就是根据不同的商品编号对商品的每个订单中的商品数量进行相加之后返回最终的结果,并且没一个商品单独一行进行展示,这里面的逻辑和 Excel 数据透视表的逻辑是一模一样的,而且运行起来要比 Excel 透视表更快,可以处理的数据量更大。具体实现如下:

上面的语句就是通过商品编号进行销量合计,然后把这个合计的字段命名为 Prods_num_sum ,最后一个 Group BY Prods_id 意思就是根据 Prods_id 这个字段里面的值进行数据分组。这是一个较为简单,也是比较常用的一个数据分组操作。

分组数据不仅可以返回合计值,还可以运行之前所有的数据汇总操作,包括返回平均值AVG();行数COUNT()等等这些想要的数据汇总结果,就相当于在数据透视表上面设置字段的值是一样的,可以有多个选择。

分组数据还可以通过配合 WHERE 过滤语句进行使用,比如说在一年的销售数据表里面,可以通过 WHERE 对时间进行过滤,过滤得到12月份的商品销售数据的汇总。还可以是根据商品的分类进行过滤,总之可以配合之前学习的那些功能搭配起来进行使用。

对于分组数据得到的结果,还可以对数据进行排序,排序语句 ORDER BY 需要放在整个语句的最后,否则就会出现错误。

2. 使用 HAVING 过滤分组得到的数据

上面提到了关于分组数据的操作,直接得到的分组数据是所有的数据,有时候我们不需要返回所有的数据,比如我们只需要一个月销量大于 10 的结果,小于 10 的那些产品销售数据我们就不需要打印出来。需要实现这个功能就需要使用另外一个过滤操作符,那就是 HAVING 操作符,比如上面的实例添加上 HAVING sum(Prods_num) <= 10 这个语句就可以将销售数量小于 10 的数据去掉。具体实现如下:

HAVING() 和 WHERE() 都是对数据进行过滤的,但是两者是有很大区别的。为了方便理解,从它们作用的时间说起吧。WHERE() 实在计算分组数据的时候就执行的,就是说 WHERE() 是过滤哪些数据需要分组。而 HAVING() 实在数据计算分组之后执行的,意思就是判断那些不不满足条件的数据就不被打印出来。也可以理解为为 WHERE() 是对之前的 Prods_num 进行过滤,而 HAVING() 是对后面的 Prods_num_sum 进行过滤。

—EOF—

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d 博主赞过: