You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键说明

  1. 区分行级差值与总和:

    • 新增Row Positive Difference和Row Negative Difference列,分别展示当前行的正负差值(不符合条件时显示0);
    • Total Positive Difference和Total Negative Difference则通过SUM()嵌套CASE WHEN,只对符合条件的差值求和,而非计数。
  2. GROUP BY的正确性:
    我在GROUP BY中包含了所有SELECT中的非聚合字段,这是为了适配SQL的ONLY_FULL_GROUP_BY模式(多数现代数据库默认开启),避免分组逻辑错误。

  3. 差值逻辑匹配:
    你的需求提到“差值=NewPrice - Old Price”,这里我沿用了你原SQL的逻辑,即新总价(单价×数量)减去旧总价,如果需要改为单价比价,只需把计算式改成di.price2 - di.price即可。

内容的提问来源于stack exchange,提问作者Dusan Djokic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:03:23