MySQL:分组求和和和减法

MySQL:分组求和和和减法,mysql,sql,Mysql,Sql,你能帮我选一个吗 我有两个演示表: 塔巴: 及 表B: 我需要这个结果: **year Company DT Quantity** **2018 FGG 01 3** (1+2) as sum for 2018 group by company, DT **2020 FGG 01 4** (3+4) - (1+2) as (sum for 2020) – (sum for 2018) group by company, DT **2018 AV 01 5** 5

你能帮我选一个吗

我有两个演示表:

塔巴:

表B:

我需要这个结果:

**year  Company DT  Quantity**  
**2018  FGG 01  3**   (1+2) as sum for 2018 group by company, DT
**2020  FGG 01  4**  (3+4) - (1+2) as (sum for 2020) – (sum for 2018) group by company, DT
**2018  AV  01  5**   5  as sum for 2018 group by company, DT
**2018  FGG 02  8**  (1+7) as sum for 2018 group by company, DT
**2020  FGG 02  9**  (8+9) - (1+7) as (sum for 2020) – (sum for 2018) group by company, DT
**2018  AV  02  10**    10  as sum for 2018 group by company, DT
我试过这个:

SELECT 
A.year,A.company,B.DT,
CASE
WHEN A.year='2020' AND A.company='FGG' THEN
((SELECT sum(quantity) FROM TabA A join TabB B
ON A.id=B.id where A.year='2020' AND A.company='FGG')
- (SELECT sum(quantity) FROM TabA A join TabB B
ON A.id=B.id where A.year='2018' AND A.company='FGG'))
Else sum(quantity) END quantity
from TabA A
join TabB B ON A.id=B.id
group by 
A.year,A.company,B.DT order by DT, year;
但这是不对的。虽然2018年的金额对于每个DT和每个公司来说都是可以的,但2020年的数量对于DT和DT都是13(而不是DT'01'的4和DT'02'的9),因此该减项不单独按DT'01'和'02'分组


请帮助我找到正确的解决方案。

假设您运行的是MySQL 8.0,您可以使用聚合和窗口功能来实现:

select
    a.year,
    a.company,
    b.dt,
    case 
        when a.year = 2018 
            then sum(b.quantity)
        when a.year = 2020
            then sum(b.quantity) 
                - sum(case when a.year = 2018 then sum(b.quantity) else 0 end) 
                  over(partition by a.company, b.dt)
    end quantity
from taba a
inner join tabb b on b.id = a.id
group by
    a.year,
    a.company,
    b.dt
您并没有明确要求以下内容,但是:我们可以通过减去之前的合计数量(如果没有,则为0),使其更简短、更通用:


如果一家公司只有2020年的数据呢?非常感谢GMB!上帝保佑你。它有效:)我试了第一个(用2020年而不是2000年的od),它很完美。欢迎@keri。如果我的答案正确回答了你的问题,请点击复选标记。。。谢谢您是否知道是否可以以任何其他方式重写此选择?您的脚本是正确的,我也尝试在MariaDB上运行它(旧版本5.5.60),并且似乎在子句over(partition by…)上有问题。您可以推荐我一些其他的东西吗?这次是MariaDB?
SELECT 
A.year,A.company,B.DT,
CASE
WHEN A.year='2020' AND A.company='FGG' THEN
((SELECT sum(quantity) FROM TabA A join TabB B
ON A.id=B.id where A.year='2020' AND A.company='FGG')
- (SELECT sum(quantity) FROM TabA A join TabB B
ON A.id=B.id where A.year='2018' AND A.company='FGG'))
Else sum(quantity) END quantity
from TabA A
join TabB B ON A.id=B.id
group by 
A.year,A.company,B.DT order by DT, year;
select
    a.year,
    a.company,
    b.dt,
    case 
        when a.year = 2018 
            then sum(b.quantity)
        when a.year = 2020
            then sum(b.quantity) 
                - sum(case when a.year = 2018 then sum(b.quantity) else 0 end) 
                  over(partition by a.company, b.dt)
    end quantity
from taba a
inner join tabb b on b.id = a.id
group by
    a.year,
    a.company,
    b.dt
select
    a.year,
    a.company,
    b.dt,
    sum(b.quantity) - coalesce(
        lag(sum(b.quantity)) over(partition by a.company, b.dt order by a.year), 
        0
    ) quantity
from taba a
inner join tabb b on b.id = a.id
group by
    a.year,
    a.company,
    b.dt