SQL如何按客户、零件号分别汇总正负值的发货数量
需求实现解决方案
错误原因分析
- 原SQL的CASE判断逻辑写在SUM聚合函数外部,引用了未加入GROUP BY子句的
Ship_Quantity字段,数据库无法确定分组后取哪一行的Ship_Quantity做条件判断,因此抛出列无效错误。 - 后续将
Ship_Quantity加入GROUP BY后,相当于按每个独立的发货数值分组,无法实现所有正数、所有负数分别汇总的需求,因此结果不符合预期。
正确实现SQL
核心逻辑是新增正负值标识作为分组维度,同一客户、同一零件下,所有正数归为一组汇总,所有负数归为一组汇总。
写法1(使用SIGN函数,兼容大多数主流数据库MySQL、SQL Server、PostgreSQL等)
SELECT Customer_Number, Part_Number, SUM(Shipped) AS Shipped FROM Sales_Line GROUP BY Customer_Number, Part_Number, SIGN(Shipped) -- 可选:过滤掉汇总后为0的记录,不需要可删除下行 HAVING SUM(Shipped) != 0
写法2(使用CASE自定义分组标识,兼容所有数据库)
如果你的数据库不支持SIGN函数,可以用CASE表达式替代分组维度:
SELECT Customer_Number, Part_Number, SUM(Shipped) AS Shipped FROM Sales_Line GROUP BY Customer_Number, Part_Number, CASE WHEN Shipped > 0 THEN 1 WHEN Shipped < 0 THEN -1 ELSE 0 END
效果验证
用你提供的测试数据执行上述SQL后,会返回预期结果:
- A080+C76组合会返回一行正数汇总(21+79+1+11+99=211)、一行负数汇总(-11-1-2-1-1=-16)
- A045+X150组合会返回一行正数汇总(373+12+1+300+146+150+150+200+150+150=1632)、一行负数汇总(-6-1-11-2-1-1-1=-23)
内容的提问来源于stack exchange,提问作者legendaryxv2
相关产品推荐
相关产品推荐

