You need to enable JavaScript to run this app. SQL Server 2008 如何将分类统计的计数结果合并为单行展示
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 15:15:04