SQL查询疑问:添加SUM聚合函数后仅返回首行,如何获取所有行及总和?
嘿,这个问题我之前也踩过坑!让我给你理清楚为啥会这样,还有怎么解决:
为啥加了SUM之后只返回第一行?
当你在SELECT语句里同时放普通列(比如p_id、paid_amount、date)和聚合函数sum(paid_amount),但没加GROUP BY子句的时候,数据库会把整个payments表当成一个单独的分组来计算总和。这时候聚合函数会把整个分组的结果压缩成一行,所以你只能看到第一行数据(其实是整个分组的聚合结果)。
解决方案:两种常用方法
方法1:用窗口函数(推荐,现代SQL数据库都支持)
窗口函数可以让你在保留所有行数据的同时,计算整个数据集的聚合值。语法很简单:
select p_id, paid_amount, date, sum(paid_amount) over () as total_sum from payments;
这里的over ()表示“基于整个结果集来计算总和”,所以每一行都会显示paid_amount列的全局总和,同时保留所有原始行的数据。
这种方法适用于MySQL 8.0+、PostgreSQL、SQL Server、Oracle等绝大多数现代数据库。
方法2:用交叉连接(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用子查询先算出总和,再通过交叉连接把总和和每一行数据关联起来:
select p.p_id, p.paid_amount, p.date, s.total_sum from payments p cross join (select sum(paid_amount) as total_sum from payments) s;
这个逻辑是:先通过子查询(select sum(paid_amount) ...)算出整个表的总和,然后把这个单一结果和payments表的每一行做交叉连接,这样每一行都会带上这个总和值。
内容的提问来源于stack exchange,提问作者Captaîn Aamusane




