SQL查询统计包裹M2、UN维度时返回两行而非一行如何解决
问题原因
你现在返回多行的核心问题是GROUP BY子句包含了S.Unity字段,这会按每个单位类型拆分分组,自然每个单位对应一行数据。另外你把CASE WHEN写在了聚合函数SUM的外层,也导致每个分组只能计算对应单位的数值。
修复后的SQL
SELECT C.Package AS 'Package', SUM(CASE S.Unity WHEN 'M2' THEN L.Qt * S.ConvEst ELSE 0 END) AS 'M2', SUM(CASE S.Unity WHEN 'UN' THEN L.Qt ELSE 0 END) AS 'UN' FROM PackageTable AS C INNER JOIN PackageTableRows L ON L.Package = C.Package INNER JOIN Products S ON S.Product = L.Product WHERE C.Package = '587496' GROUP BY C.Package
修改点说明
- 移除了
GROUP BY中的S.Unity字段,仅按包裹号分组,保证一个包裹只返回一行 - 将
CASE WHEN逻辑放到SUM函数内部,这样聚合时会自动匹配对应单位的数值累加,不需要按单位拆分分组 - 移除了不必要的
DISTINCT,GROUP BY C.Package已经保证包裹号唯一,不需要额外去重 - 把
CASE的默认返回值从NULL改成了0,如果你需要无对应单位时返回NULL,可以把ELSE 0改回ELSE NULL,SUM计算时会自动忽略NULL值,不影响最终统计结果
内容的提问来源于stack exchange,提问作者Forrobodo
相关产品推荐
相关产品推荐

