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

MySQL分组查询中同时实现求和与差值计算的问题求助

正确编写按DT分组计算2020年FGG差值的SELECT语句

你的问题出在子查询没有按DT进行过滤——原来的子查询计算的是所有FGG公司2020年和2018年的总Quantity差值,而不是针对每个DT单独计算,所以所有DT分组下的2020年FGG结果都变成了全局差值。

下面提供两种可行的解决方案,都能精准按DT分组计算差值:

方法1:使用CTE预计算分组总和

先通过CTE(公共表表达式)计算出每个(year, Company, DT)组合的Quantity总和,再针对2020年的FGG数据,关联同公司同DT的2018年总和做减法:

WITH GroupedData AS (
    SELECT 
        A.year,
        A.Company,
        B.DT,
        SUM(B.Quantity) AS sum_quantity
    FROM TabA A
    JOIN TabB B ON A.ID = B.ID
    GROUP BY A.year, A.Company, B.DT
)
SELECT 
    gd.year,
    gd.Company,
    gd.DT,
    CASE 
        WHEN gd.year = '2020' AND gd.Company = 'FGG' 
        THEN gd.sum_quantity - (SELECT sum_quantity FROM GroupedData WHERE Company = gd.Company AND DT = gd.DT AND year = '2018')
        ELSE gd.sum_quantity
    END AS Quantity
FROM GroupedData gd
ORDER BY gd.DT, gd.year;

方法2:使用自关联(LEFT JOIN)预过滤2018年FGG数据

把2018年FGG的每个DT总和单独提取出来,再和全部分组数据关联,直接计算差值:

SELECT 
    gd.year,
    gd.Company,
    gd.DT,
    CASE 
        WHEN gd.year = '2020' AND gd.Company = 'FGG' 
        THEN gd.sum_quantity - COALESCE(gd_2018.sum_quantity, 0) -- COALESCE避免无匹配时出现NULL
        ELSE gd.sum_quantity
    END AS Quantity
FROM (
    SELECT 
        A.year,
        A.Company,
        B.DT,
        SUM(B.Quantity) AS sum_quantity
    FROM TabA A
    JOIN TabB B ON A.ID = B.ID
    GROUP BY A.year, A.Company, B.DT
) gd
LEFT JOIN (
    SELECT 
        A.Company,
        B.DT,
        SUM(B.Quantity) AS sum_quantity
    FROM TabA A
    JOIN TabB B ON A.ID = B.ID
    WHERE A.year = '2018' AND A.Company = 'FGG'
    GROUP BY A.Company, B.DT
) gd_2018 ON gd.Company = gd_2018.Company AND gd.DT = gd_2018.DT
ORDER BY gd.DT, gd.year;

验证结果

两种方法都能得到你期望的查询结果:

yearCompanyDTQuantity
2018FGG013
2020FGG014
2018AV015
2018FGG028
2020FGG029
2018AV0210

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:58:10