如何修改SQL分组求和查询得到全部分组总分 可使用哪些窗口函数
实现方案
可以通过窗口函数完成需求,无需额外关联其他表,修改后的查询语句如下:
SELECT player, SUM(score) AS sum_score, SUM(SUM(score)) OVER() AS total_score FROM game GROUP BY player;
逻辑说明
窗口函数的执行顺序晚于GROUP BY分组聚合,这里OVER()没有指定分区、排序规则,会把整个分组后的结果集作为唯一窗口计算总和,刚好得到所有玩家总分之和766。
如果你的数据库不支持嵌套聚合的窗口函数写法,也可以用子查询包裹原有逻辑,兼容性更强:
SELECT player, sum_score, SUM(sum_score) OVER() AS total_score FROM ( SELECT player, SUM(score) AS sum_score FROM game GROUP BY player ) AS player_score
执行后得到的结果如下:
| Player | sum_score | total_score |
|---|---|---|
| John | 256 | 766 |
| Tom | 366 | 766 |
| Lucy | 144 | 766 |
如果需要直接计算占比,可以直接在查询中新增对应列,示例如下:
SELECT player, SUM(score) AS sum_score, SUM(SUM(score)) OVER() AS total_score, ROUND(SUM(score) * 100.0 / SUM(SUM(score)) OVER(), 2) AS score_rate FROM game GROUP BY player;
内容的提问来源于stack exchange,提问作者Priyansh
相关产品推荐
相关产品推荐

