MySQL 基于列值运行总计

Posted

技术标签:

【中文标题】MySQL 基于列值运行总计【英文标题】:MySQL Running Total Based On a Column Values 【发布时间】:2021-11-07 17:15:00 【问题描述】:

我正在尝试生成一个基于列运行总计的表格

假设我有一张这样的桌子:

company year profit
google 2020 16
google 2021 18
apple 2020 20
apple 2021 26
bp 2020 15
bp 2021 10

想要的结果是

company year profit cum profit
google 2019 16 16
google 2020 18 34
google 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
google 2019 16 16
google 2020 18 34
google 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
google 2019 16 16
google 2020 18 34
google 2021 13 47

dbhere

【讨论】:

感谢您的回答。我编辑了问题! @CihanAltun 感谢分享数据。我添加了新的答案。请看一看。 这不是解决方案,这是简单的 group by。请查看我想要的结果表 @CihanAltun 抱歉,我误解了您的问题。我已经修改了答案。【参考方案2】:

这看起来不像是一个运行总计。它看起来像简单的聚合:

select company, field, sum(profit)
from t
group by company, field;

【讨论】:

您好,我编辑了问题,您可以查看一下吗?

以上是关于MySQL 基于列值运行总计的主要内容,如果未能解决你的问题,请参考以下文章

MySQL按月汇总并运行总计[重复]

基于条件的运行总计

sql MySQL:运行总计(累计总和)

计算MySQL中的运行总计

Access Query中基于项目和日期的运行总计

Power Query 中是不是有一种方法可以根据基于文本值重置的两列计算运行总计?