SQL技术问询:拆分差值列并分别统计正负差值总和
解决方法:拆分正负差值并计算各自总和
我看了你的需求和现有SQL,发现有个关键问题:你当前用SUM(di.price2 * di.quantity - di.itemvalue > 0)其实是在统计满足差值大于0的行数,而不是计算这些差值的总和。同样,负差值的SUM逻辑也是计数,不是求和。下面我帮你修正代码,实现你要的效果:
修正后的SQL代码
SELECT p.productid AS 'Redni broj', p.code AS 'Sifra robe', p.unitname AS 'Jedinica mere', di.quantity AS 'Kolicina', di.price AS 'Stara cena', di.itemvalue AS 'Stari iznos', di.price2 AS 'Nova cena', (di.price2 * di.quantity) AS 'Novi iznos', -- 显示当前行的总差值(新总价 - 旧总价) (di.price2 * di.quantity - di.itemvalue) AS 'Difference', -- 当前行的正差值(仅当差值>0时显示原值,否则为0) CASE WHEN (di.price2 * di.quantity - di.itemvalue) > 0 THEN (di.price2 * di.quantity - di.itemvalue) ELSE 0 END AS 'Row Positive Difference', -- 当前行的负差值(仅当差值<0时显示原值,否则为0) CASE WHEN (di.price2 * di.quantity - di.itemvalue) < 0 THEN (di.price2 * di.quantity - di.itemvalue) ELSE 0 END AS 'Row Negative Difference', -- 分组内所有正差值的总和 SUM( CASE WHEN (di.price2 * di.quantity - di.itemvalue) > 0 THEN (di.price2 * di.quantity - di.itemvalue) ELSE 0 END ) AS 'Total Positive Difference', -- 分组内所有负差值的总和 SUM( CASE WHEN (di.price2 * di.quantity - di.itemvalue) < 0 THEN (di.price2 * di.quantity - di.itemvalue) ELSE 0 END ) AS 'Total Negative Difference' FROM product AS p LEFT JOIN productcategorypr AS pc ON p.productid = pc.productid LEFT JOIN documentitem AS di ON p.productid = di.productid GROUP BY p.productid, p.code, p.unitname, di.quantity, di.price, di.itemvalue, di.price2, (di.price2 * di.quantity), (di.price2 * di.quantity - di.itemvalue)
关键说明
区分行级差值与总和:
- 新增
Row Positive Difference和Row Negative Difference列,分别展示当前行的正负差值(不符合条件时显示0); Total Positive Difference和Total Negative Difference则通过SUM()嵌套CASE WHEN,只对符合条件的差值求和,而非计数。
- 新增
GROUP BY的正确性:
我在GROUP BY中包含了所有SELECT中的非聚合字段,这是为了适配SQL的ONLY_FULL_GROUP_BY模式(多数现代数据库默认开启),避免分组逻辑错误。差值逻辑匹配:
你的需求提到“差值=NewPrice - Old Price”,这里我沿用了你原SQL的逻辑,即新总价(单价×数量)减去旧总价,如果需要改为单价比价,只需把计算式改成di.price2 - di.price即可。
内容的提问来源于stack exchange,提问作者Dusan Djokic
相关产品推荐
相关产品推荐

