MySQL 基于列值运行总计
Posted
技术标签:
【中文标题】MySQL 基于列值运行总计【英文标题】:MySQL Running Total Based On a Column Values 【发布时间】:2021-11-07 17:15:00 【问题描述】:我正在尝试生成一个基于列运行总计的表格
假设我有一张这样的桌子:
company | year | profit |
---|---|---|
2020 | 16 | |
2021 | 18 | |
apple | 2020 | 20 |
apple | 2021 | 26 |
bp | 2020 | 15 |
bp | 2021 | 10 |
想要的结果是
company | year | profit | cum profit |
---|---|---|---|
2019 | 16 | 16 | |
2020 | 18 | 34 | |
2021 | 13 | 47 | |
apple | 2019 | 20 | 20 |
apple | 2020 | 26 | 46 |
apple | 2021 | 21 | 67 |
bp | 2019 | 15 | 15 |
bp | 2020 | 10 | 25 |
bp | 2021 | 17 | 42 |
我找到了一种方法,但它会不断地累加,而无需查找公司名称。每个公司都应该有自己的运行总数。
这是我的方式:
SELECT company, year, profit,
CAST((@cum_profit:= @cum_profit + profit) AS DECIMAL(16, 2)) AS cum_profit
FROM table
GROUP BY company, year) AS t
JOIN(SELECT @cum_profit:= 0) AS tmp;
结果是连续运行的总计,但我需要每个公司自己的运行总计。
【问题讨论】:
【参考方案1】:对于旧版本的 mysql,您可以使用子查询来完成,在 MySQL 8.0 及更高版本中,您可以使用sum()over()
按公司列分区的窗口函数。
架构和插入语句:
create table company_profit(company varchar(50), year int, profit int );
insert into company_profit values('google', 2019, 16);
insert into company_profit values('google', 2020, 18);
insert into company_profit values('google', 2021, 13);
insert into company_profit values('apple', 2019, 20);
insert into company_profit values('apple', 2020, 26);
insert into company_profit values('apple', 2021, 21);
insert into company_profit values('bp', 2019, 15);
insert into company_profit values('bp', 2020, 10);
insert into company_profit values('bp', 2021, 17);
使用子查询运行总查询(对于 MySQL 8.0 之前的旧版本)
select company,year,profit,
(select sum(profit) from company_profit c where c.company=cp.company and c.year<=cp.year) as cum_profit
from company_profit cp
输出:
company | year | profit | cum_profit |
---|---|---|---|
2019 | 16 | 16 | |
2020 | 18 | 34 | |
2021 | 13 | 47 | |
apple | 2019 | 20 | 20 |
apple | 2020 | 26 | 46 |
apple | 2021 | 21 | 67 |
bp | 2019 | 15 | 15 |
bp | 2020 | 10 | 25 |
bp | 2021 | 17 | 42 |
使用窗口函数运行总查询(适用于 MySQL 8.0 及更高版本):
select company,year,profit,sum(profit)over( partition by company order by company,year) as cum_profit
from company_profit
输出:
company | year | profit | cum_profit |
---|---|---|---|
apple | 2019 | 20 | 20 |
apple | 2020 | 26 | 46 |
apple | 2021 | 21 | 67 |
bp | 2019 | 15 | 15 |
bp | 2020 | 10 | 25 |
bp | 2021 | 17 | 42 |
2019 | 16 | 16 | |
2020 | 18 | 34 | |
2021 | 13 | 47 |
dbhere
【讨论】:
感谢您的回答。我编辑了问题! @CihanAltun 感谢分享数据。我添加了新的答案。请看一看。 这不是解决方案,这是简单的 group by。请查看我想要的结果表 @CihanAltun 抱歉,我误解了您的问题。我已经修改了答案。【参考方案2】:这看起来不像是一个运行总计。它看起来像简单的聚合:
select company, field, sum(profit)
from t
group by company, field;
【讨论】:
您好,我编辑了问题,您可以查看一下吗?以上是关于MySQL 基于列值运行总计的主要内容,如果未能解决你的问题,请参考以下文章