举例一:
下面是一张【商品的售出情况汇总表 tb_goods_sale】 ,表字段解释如下:
目前表中有3条数据,如下图,我们利用GROUP BY WITH ROLLUP 进行统计汇总商品的【售出总数】和【营销额】
sql如下:
SELECT
a.goods_name,
sum( saled_count ) AS "售出数量",
sum( a.saled_count * a.unit_price ) AS "营销额"
FROM
`tb_goods_sale` a
GROUP BY
a.goods_name WITH ROLLUP;
输出结果:
我们发现最后汇总行少了名称,我们利用COALESCE做一个优化
SELECT COALESCE
( aa.goods_name, '汇总' ) AS "商品名称",
aa.售出数量,
aa.营销额
FROM
(
SELECT
a.goods_name,
sum( saled_count ) AS "售出数量",
sum( a.saled_count * a.unit_price ) AS "营销额"
FROM
`tb_goods_sale` a
GROUP BY
a.goods_name WITH ROLLUP
) aa;
输出结果如下:
举例二:
下面是一张【商品售出的明细表 tb_goods_sale_detail】,表字段解释如下:
目前表中有6条数据,如下图,我们利用GROUP BY WITH ROLLUP 进行统计汇总商品的【售出总数】和【营销额】
sql如下:
SELECT
a.goods_name,
count( * ) AS "售出数量",
sum( a.price ) AS "营销额"
FROM
`tb_goods_sale_detail` a
GROUP BY
a.goods_name WITH ROLLUP;
输出结果如下:
我们发现最后汇总行少了名称,我们利用COALESCE做一个优化
SELECT COALESCE
( aa.goods_name, '汇总' ) AS "商品名称",
aa.售出数量,
aa.营销额
FROM
(
SELECT
a.goods_name,
count( * ) AS "售出数量",
sum( a.price ) AS "营销额"
FROM
`tb_goods_sale_detail` a
GROUP BY
a.goods_name WITH ROLLUP
) aa;
输出结果如下:
举例三:
在举例二【商品售出的明细表 tb_goods_sale_detail】的基础上,我们再按销售日期进行统计,为了展示效果,我在表里造了其它日期的销售数据。
我们可以利用GROUP BY WITH ROLLUP 统计出各商品每天的【售出总数】和【营销额】。
sql如下:
SELECT COALESCE
( aa.日期, '合计' ) 日期,
aa.销售总数,
aa.可乐,
aa.薯片,
aa.康师傅,
aa.总营销额,
aa.可乐营销额,
aa.薯片营销额,
aa.康师傅营销额
FROM
(
SELECT
DATE_FORMAT( a.sale_date, '%Y%m%d' ) 日期,
COUNT( * ) 销售总数,
COUNT( IF ( a.goods_name = '可乐', a.goods_name, NULL ) ) 可乐,
COUNT( IF ( a.goods_name = '薯片', a.goods_name, NULL ) ) 薯片,
COUNT( IF ( a.goods_name = '康师傅', a.goods_name, NULL ) ) 康师傅,
SUM( a.price ) 总营销额,
SUM( IF ( a.goods_name = '可乐', a.price, NULL ) ) 可乐营销额,
SUM( IF ( a.goods_name = '薯片', a.price, NULL ) ) 薯片营销额,
SUM( IF ( a.goods_name = '康师傅', a.price, NULL ) ) 康师傅营销额
FROM
tb_goods_sale_detail a
GROUP BY
DATE_FORMAT( a.sale_date, '%Y%m%d' ) WITH ROLLUP
) aa;
输出结果如下: