You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动