例如下列分组汇总SQL语句,返回本月每个产品类别的销售总金额:
select 产品类别,sum(单价*数量) as 销售金额 from 销售记录
where Date_Format(销售日期,'%Y%m')=Date_Format(now(),'%Y%m')
group by 产品类别
MySQL 8.0 新增了 GROUPING() 函数,用来理清 GROUP BY with rollup 子句检索后所产生的每个分组汇总结果。 grouping 可用在分组列,having 子句以及 order by 子句。
GROUPING() 函数用来返回每个分组是否为 ROLLUP 结果,是为 1 否为 0。从结果中,很容易就能区分哪些 NULL 是正常记录,哪些是 ROLLUP 的结果。
GROUPING() 函数不仅仅是针对单个字段来统计汇总值,还可以针对多个字段。
此时会发现,GROUPING() 函数对多个字段结果并非只有 1 和 0,还有一个值为 3。在 GROUPING() 函数包含多个参数时,按照以下方式来返回结果:
GROUPING(r1,r2) 等价于 GROUPING(r2) + GROUPING(r1) <<1
GROUPING(r1,r2,r3,...) 等价于 GROUPING(r3) + GROUPING(r2) <<1 + GROUPING(r1) <<2
以此类推
GROUPING 语句还可以用在 HAVING 子句里,比如用 GROUPING 子句来过滤掉非 ROLLUP 的结果。
MYSQL数据库
SELECT 产品,GROUP_CONCAT(零件),SUM(数量),SUM(金额) FROM (
SELECT 'A' AS 产品,'A1' AS 零件,'10' AS 数量,'10' AS 金额
UNION ALL
SELECT 'A' AS 产品,'A2' AS 零件,'20' AS 数量,'20' AS 金额
UNION ALL
SELECT 'A' AS 产品,'A3' AS 零件,'10' AS 数量,'10' AS 金额
UNION ALL
SELECT 'B' AS 产品,'B1' AS 零件,'10' AS 数量,'10' AS 金额
UNION ALL
SELECT 'B' AS 产品,'B2' AS 零件,'20' AS 数量,'20' AS 金额
UNION ALL
SELECT 'B' AS 产品,'B3' AS 零件,'10' AS 数量,'10' AS 金额
) T GROUP BY 产品
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)