SQL Server 2014数据统计求助:按ID和Service统计已付未付数量及差值
解决SQL Server分组统计已付/未付数量的问题
嘿,我明白你现在的困扰——单独统计已付或未付没问题,但要把两个结果放在同一行就卡壳了对吧?你的Union思路其实走偏了,因为Union是用来合并不同结果集的,而我们需要的是同一分组内的条件聚合,用CASE WHEN配合SUM就能轻松搞定。
先看正确的SQL语句:
SELECT ID, Service, SUM(CASE WHEN Paid IS NULL OR Paid <> N'N' THEN 1 ELSE 0 END) AS CountOfPaid, SUM(CASE WHEN Paid = N'N' THEN 1 ELSE 0 END) AS CountOfUnPaid, SUM(CASE WHEN Paid IS NULL OR Paid <> N'N' THEN 1 ELSE 0 END) - SUM(CASE WHEN Paid = N'N' THEN 1 ELSE 0 END) AS Difference FROM TEST GROUP BY ID, Service ORDER BY ID ASC;
代码解释:
- 条件聚合核心:用
CASE WHEN判断每行的Paid状态,符合条件就返回1,否则0,再用SUM把这些1加起来,就得到对应状态的行数。CountOfPaid:统计Paid为空或者不等于N的记录数(对应你期望的“已付”)CountOfUnPaid:统计Paid等于N的记录数(对应“未付”)
- Difference计算:直接用已付数量减去未付数量,得到差值。
- 分组与排序:按
ID和Service分组,最后按ID升序排列,和你期望的结果格式完全匹配。
为什么你的原方法不行?
你用Union把两个分组结果拼在一起,然后再SUM,这会导致同一个分组的已付、未付数据变成两行,最后SUM的时候其实是把两个数加起来,根本达不到同一行展示两个统计值的效果。条件聚合才是这类“同一分组多维度统计”场景的标准解法。
运行上面的SQL,就能得到你想要的结果啦!
内容的提问来源于stack exchange,提问作者user3782230
相关产品推荐
相关产品推荐

