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;
验证结果
两种方法都能得到你期望的查询结果:
| year | Company | DT | Quantity |
|---|---|---|---|
| 2018 | FGG | 01 | 3 |
| 2020 | FGG | 01 | 4 |
| 2018 | AV | 01 | 5 |
| 2018 | FGG | 02 | 8 |
| 2020 | FGG | 02 | 9 |
| 2018 | AV | 02 | 10 |
内容的提问来源于stack exchange,提问作者keri
相关产品推荐
相关产品推荐

