版权声明:转载请注明出处 https://blog.csdn.net/hawk_2016/article/details/81512948
今天在一本书上看到了 group by [column…] [with cube|with rollup]的用法,对于多层级汇总很好,避免了自己拼凑语句(把汇总数据加在最后)。
1、单字段分组
SELECT
isnull(bd.bu_name,'合计') as bu_name
,sum(sales_quantity) as sales_quantity
,sum(sales_amt-deduction_voucher_amt) as net_amt
FROM sales_order_ontime so
JOIN Business_Segment AS bs ON bs.dept_name = so.sales_dept
JOIN Business_Dic AS bd ON bd.bs_id = bs.bs_id
where so.order_date=convert(varchar(10),getdate(),120)
group by bd.bu_name with cube
结果如下(用isnull转换成汇总):
2、多字段分组
SELECT
isnull(bd.bu_id,'二级合计') as bu_id
,isnull(bd.bs_id,'一级合计') as bs_id
,sum(sales_quantity) as sales_quantity
,sum(sales_amt-deduction_voucher_amt) as net_amt
FROM sales_order_ontime so
JOIN Business_Segment AS bs ON bs.dept_name = so.sales_dept
JOIN Business_Dic AS bd ON bd.bs_id = bs.bs_id
where so.order_date=convert(varchar(10),getdate(),120)
group by bd.bu_id,bd.bs_id with cube
输出结果:
3、with rollup
基本类似,仅仅是少了一个总合计(两个字段为null的记录)
4、GROUPING()
是一个聚合函数,它产生一个附加的列,当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。
仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相联系的选择列表中才允许分组。
通俗点:就是分层级汇总后,如果是根据cube语法产生null值,GROUPING返回0,否则为1。例如:当分组列中含有null值后,分组后这个空值也会单独分组成null。通过GROUPING可以明确区分这种情况。