@xuxuzhaozhao
2018-05-14T07:11:59.000000Z
字数 914
阅读 641
SqlServer
1、GROUP BY
中查找根据某列值分组不能使用WHERE
语句,要使用HAVING
--订单属性大于等于2
SELECT 订单属性 ,
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 '订单属性' ,
CASE
WHEN 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(订单属性, 状态);