You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL如何按指定列分组计算累计值(Running Total)

MySQL按公司分组计算逐年累计利润的实现方案

方案1:MySQL 8.0及以上版本(推荐,窗口函数实现)

直接用分区求和窗口函数,语法简洁不易出错:

SELECT 
  company,
  year,
  profit,
  CAST(SUM(profit) OVER (PARTITION BY company ORDER BY year) AS DECIMAL(16,2)) AS cum_profit
FROM `table`
GROUP BY company, year
ORDER BY company, year;

核心逻辑:PARTITION BY company会把数据按公司拆分成分区,每个分区内独立按年份升序累加利润,切换公司时自动重置累计值,完全符合需求。

方案2:MySQL 5.x及更低版本(用户变量兼容实现)

你的原有写法只做了全局累计,没有新增公司切换的判断逻辑,修改后代码如下:

SELECT 
  company,
  year,
  profit,
  cum_profit
FROM (
  SELECT 
    company,
    year,
    profit,
    CAST(
      @cum_profit := IF(@prev_company = company, @cum_profit + profit, profit)
    AS DECIMAL(16,2)) AS cum_profit,
    @prev_company := company
  FROM (
    -- 必须先按公司、年份排序,保证变量计算的顺序正确
    SELECT company, year, profit
    FROM `table`
    GROUP BY company, year
    ORDER BY company, year
  ) AS sorted_data
  CROSS JOIN (SELECT @cum_profit := 0, @prev_company := '') AS init_var
) AS result;

注意事项:

  • 变量计算依赖数据的排序顺序,必须先按company、year排序后再做累计计算
  • 外层嵌套SELECT可以去掉辅助变量的输出字段,只保留需要的结果

内容的提问来源于stack exchange,提问作者Cihan Altun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:24:03