MySQL:分组求和和和减法
你能帮我选一个吗 我有两个演示表: 塔巴: 及 表B: 我需要这个结果: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
**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