You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:00:12