[关闭]
@xuxuzhaozhao 2018-05-14T07:11:59.000000Z 字数 914 阅读 641

SqlServer Groupby 高级引用

SqlServer


1、GROUP BY中查找根据某列值分组不能使用WHERE语句,要使用HAVING

  1. --订单属性大于等于2
  2. SELECT 订单属性 ,
  3. COUNT(订单编号)
  4. FROM dbo.订单表
  5. GROUP BY 订单属性
  6. HAVING COUNT(1) >= 2;

运行结果

订单属性 数量
变更单 2
反冲单 3
废弃单 3
正常单 288

2、Rollup分组产生的结果集包含常规的分组和小计行。在生成包含小计和合计的报表时,ROLLUP 运算符很有用。

  1. --ROLLUP(归纳汇总)
  2. SELECT 订单属性 ,
  3. 状态 ,
  4. COUNT(订单编号)
  5. FROM dbo.订单表
  6. GROUP BY ROLLUP(订单属性, 状态);
  7. --使用grouping函数标识rollup或者cube创建的行
  8. --用GROUPING函数模拟能够发现在一行中的构成小计的分组,返回0或者1
  9. --GROUPING函数返回0意味着下列情况:这个表达式包含在小计中.
  10. --GROUPING函数返回1意味着下列情况:这个表达式没有包含在小计中.
  11. SELECT CASE WHEN 订单属性 IS NULL THEN '全部订单'
  12. ELSE 订单属性
  13. END AS '订单属性' ,
  14. CASE
  15. WHEN GROUPING(状态) = 1 AND GROUPING(订单属性) = 0 THEN '小计'
  16. WHEN GROUPING(状态) = 1 AND GROUPING(订单属性) = 1 THEN '合计'
  17. ELSE 状态
  18. END AS '状态' ,
  19. COUNT(订单编号) AS 数量
  20. FROM dbo.订单表
  21. GROUP BY ROLLUP(订单属性, 状态);

运行结果

订单属性 状态 数量
变更单 已订单审核 2
变更单 小计 2
冻结单 已非标检查 1
冻结单 小计 1
反冲单 已财务审核 1
反冲单 已订单审核 2
反冲单 小计 3
废弃单 已财务审核 1
废弃单 已订单审核 2
废弃单 小计 3
正常单 已财务审核 10
正常单 已订单审核 148
正常单 已非标检查 105
正常单 已工艺审核 1
正常单 已经销商确认 5
正常单 已生产审核 2
正常单 已提交 3
正常单 正在录单 14
正常单 小计 288
全部订单 合计 297
  1. -- cube 相当于对rollup的扩展
  2. SELECT 订单属性 ,
  3. 状态 ,
  4. COUNT(订单编号)
  5. FROM dbo.订单表
  6. GROUP BY cube(订单属性, 状态);
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注