@xuxuzhaozhao
2018-05-14T07:11:59.000000Z
字数 914
阅读 711
SqlServer
1、GROUP BY中查找根据某列值分组不能使用WHERE语句,要使用HAVING
--订单属性大于等于2SELECT 订单属性 ,COUNT(订单编号)FROM dbo.订单表GROUP BY 订单属性HAVING COUNT(1) >= 2;
运行结果
| 订单属性 | 数量 |
|---|---|
| 变更单 | 2 |
| 反冲单 | 3 |
| 废弃单 | 3 |
| 正常单 | 288 |
2、Rollup分组产生的结果集包含常规的分组和小计行。在生成包含小计和合计的报表时,ROLLUP 运算符很有用。
--ROLLUP(归纳汇总)SELECT 订单属性 ,状态 ,COUNT(订单编号)FROM dbo.订单表GROUP BY ROLLUP(订单属性, 状态);--使用grouping函数标识rollup或者cube创建的行--用GROUPING函数模拟能够发现在一行中的构成小计的分组,返回0或者1。--GROUPING函数返回0意味着下列情况:这个表达式包含在小计中.--GROUPING函数返回1意味着下列情况:这个表达式没有包含在小计中.SELECT CASE WHEN 订单属性 IS NULL THEN '全部订单'ELSE 订单属性END AS '订单属性' ,CASEWHEN GROUPING(状态) = 1 AND GROUPING(订单属性) = 0 THEN '小计'WHEN GROUPING(状态) = 1 AND GROUPING(订单属性) = 1 THEN '合计'ELSE 状态END AS '状态' ,COUNT(订单编号) AS 数量FROM dbo.订单表GROUP BY ROLLUP(订单属性, 状态);
运行结果
| 订单属性 | 状态 | 数量 |
|---|---|---|
| 变更单 | 已订单审核 | 2 |
| 变更单 | 小计 | 2 |
| 冻结单 | 已非标检查 | 1 |
| 冻结单 | 小计 | 1 |
| 反冲单 | 已财务审核 | 1 |
| 反冲单 | 已订单审核 | 2 |
| 反冲单 | 小计 | 3 |
| 废弃单 | 已财务审核 | 1 |
| 废弃单 | 已订单审核 | 2 |
| 废弃单 | 小计 | 3 |
| 正常单 | 已财务审核 | 10 |
| 正常单 | 已订单审核 | 148 |
| 正常单 | 已非标检查 | 105 |
| 正常单 | 已工艺审核 | 1 |
| 正常单 | 已经销商确认 | 5 |
| 正常单 | 已生产审核 | 2 |
| 正常单 | 已提交 | 3 |
| 正常单 | 正在录单 | 14 |
| 正常单 | 小计 | 288 |
| 全部订单 | 合计 | 297 |
-- cube 相当于对rollup的扩展SELECT 订单属性 ,状态 ,COUNT(订单编号)FROM dbo.订单表GROUP BY cube(订单属性, 状态);