SQL Server 2008 如何将分类统计的计数结果合并为单行展示
问题根因
- 分组维度错位:当前GROUP BY子句包含
d.Inq_ConLengthId,数据库会按“询盘ID+集装箱长度ID”的粒度拆分独立分组,直接生成两行结果,和预期的“单询盘单行、多维度展示计数”的粒度不匹配。 - 行转列逻辑失效:因为每个分组内的
Inq_ConLengthId值是固定的(要么全是113,要么全不是),对应的CASE判断只会在单个组内命中一个输出列,最终导致两个长度的计数被拆分到不同行。 - 语法疏漏:SELECT子句中存在无别名的冗余
COUNT(d.Inq_ConLengthId)字段,且字段间缺少分隔逗号,实际执行时会触发语法校验错误。
你之前尝试筛RN=1的方法失效,本质是因为两个长度的计数被拆到了不同的结果行,单条行上只存在一个维度的计数值,自然无法同时拿到两个长度的统计结果。
适配SQL Server 2008的修正方案
核心调整逻辑:去掉集装箱长度ID的分组字段,改用条件聚合的方式,在同一询盘分组内分别统计不同长度的计数,具体代码如下:
SELECT -- 保持原排序规则计算行号,因最终为单询盘单行结果,行号无重复 ROW_NUMBER() OVER (PARTITION BY A.Inq_Inquiry_Kid ORDER BY A.Inq_InquiryDate) AS RN, A.Inq_Inquiry_No, -- 条件聚合:统计长度ID为113的20尺箱数量,无匹配时返回0 SUM(CASE WHEN d.Inq_ConLengthId = 113 THEN 1 ELSE 0 END) AS Length20, -- 条件聚合:统计长度ID非113的40尺箱数量,无匹配时返回0 SUM(CASE WHEN d.Inq_ConLengthId <> 113 THEN 1 ELSE 0 END) AS Length40 FROM Inquiry.tbl_SE_InquiryEntry A LEFT JOIN Inquiry.tbl_SE_ContainerType d ON A.Inq_Inquiry_Kid = d.Inq_InquiryId WHERE A.Inq_Inquiry_No = 'BOM/CRM/00047' GROUP BY -- 仅保留询盘单维度的分组字段,移除d.Inq_ConLengthId A.Inq_Inquiry_No, A.Inq_Inquiry_Kid, A.Inq_InquiryDate
优化说明:
- 相比原逻辑用字符串拼接判空的写法,直接用聚合函数返回数值型计数,更符合统计字段的使用场景,前端可按需统一调整展示格式。
- 用SUM替代原来的COUNT+CASE的写法,自动处理LEFT JOIN带来的空值场景,不会出现维度计数缺失的问题。
内容的提问来源于stack exchange,提问作者Akhileshkumar singh
相关产品推荐
相关产品推荐

