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

MySQL 5.7按Name、EID分组求和并保留所有原始行的实现方法

问题描述

现有数据表如下:

NAMEAMTEIDTran
John40001T1
Mary50002T2
John80001T3
Willi50003T4
Mary10002T5

需求:按NAME、EID分组对AMT列求和,同时保留所有原始行数据,输出格式如下:

NAMEAMTEIDTranTotal Amt
John40001T112000
Mary50002T26000
John80001T312000
Willi50003T45000
Mary10002T56000

尝试了以下SQL语句但未生效,且当前使用的MySQL 5.7不支持LEAD和LAG函数,请问如何实现目标输出?

select SUM(AMT) as TotalAmt, * from mytable
group by NAME,EID
解决方案

你之前的SQL语句问题在于GROUP BY NAME,EID后只能返回每组的聚合结果,无法保留所有原始行。在MySQL 5.7中可以用以下两种方法实现需求:

方法一:子查询关联

先通过子查询计算每个NAME+EID分组的总金额,再将原表与这个子查询结果关联:

SELECT 
    t.NAME,
    t.AMT,
    t.EID,
    t.Tran,
    g.Total_Amt
FROM mytable t
JOIN (
    SELECT NAME, EID, SUM(AMT) AS Total_Amt
    FROM mytable
    GROUP BY NAME, EID
) g ON t.NAME = g.NAME AND t.EID = g.EID;

方法二:使用窗口函数(MySQL 5.7支持)

MySQL 5.7虽然不支持LEAD/LAG,但支持SUM() OVER()窗口函数,直接在原表上计算分组总金额:

SELECT 
    NAME,
    AMT,
    EID,
    Tran,
    SUM(AMT) OVER(PARTITION BY NAME, EID) AS `Total Amt`
FROM mytable;

这两种方法都能满足需求,窗口函数写法更简洁,子查询关联则兼容性更广(如果遇到不支持窗口函数的场景)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 14:40:02