sqlserver group by [column...] [with cube|with rollup] 层级汇总

版权声明:转载请注明出处 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可以明确区分这种情况。

猜你喜欢

转载自blog.csdn.net/hawk_2016/article/details/81512948