Oracle中如何计算分组及总计金额?求适用函数
计算分组金额总计与全局总合计的SQL解决方案
嗨,我看你在计算金额总计的时候遇到了问题,想要算出A、B各自的总金额还有两者的总合计,还要添加对应的新列对吧?结合你的示例数据和需求,我给你两种实用的SQL方案,适配不同的场景:
方案一:保留原始记录,同时附带分组/全局合计(窗口函数方案)
如果需要每条原始数据行都带上对应用户的总金额,以及所有用户的总合计,用窗口函数最合适,这个方案支持MySQL 8+、PostgreSQL、SQL Server等大多数现代数据库:
SELECT id, name, date, amount, -- 计算每个用户(name)的总金额 SUM(amount) OVER (PARTITION BY name) AS individual_total, -- 计算所有符合条件记录的总合计 SUM(amount) OVER () AS grand_total FROM Table1 WHERE date > 2015 ORDER BY id, amount;
执行后你会看到,每条A的记录都带着individual_total=300,每条B的记录都带着individual_total=150,所有行的grand_total都是450,完全符合你的需求。
方案二:只生成汇总行(GROUP BY WITH ROLLUP方案)
如果不需要保留原始记录,只想要分组总计和全局合计的汇总结果,可以用GROUP BY WITH ROLLUP来生成汇总行:
SELECT -- 用COALESCE替换汇总行的NULL值,让结果更易读 COALESCE(CAST(id AS CHAR), '总计') AS id, COALESCE(name, '所有用户') AS name, SUM(amount) AS total_amount FROM Table1 WHERE date > 2015 GROUP BY id, name WITH ROLLUP ORDER BY id;
这个查询会返回3行结果:A的总计300、B的总计150、最后一行是全局总合计450,非常简洁直观。
小提示:
- 窗口函数的
PARTITION BY name可以换成PARTITION BY id,因为你的数据里id和name是一一对应的,效果完全一样 WITH ROLLUP的汇总行里,分组字段会显示为NULL,所以用COALESCE()来替换成友好的文字,比如“总计”“所有用户”
内容的提问来源于stack exchange,提问作者HenlenLee




