如何计算某列最大值的总和?SQL聚合函数嵌套问题求解
解决SQL聚合函数嵌套问题:计算2022赛季法甲球员最高市场价值总和
你遇到的核心问题是SQL不允许直接嵌套聚合函数(比如SUM(MAX(...))),因为MAX()是分组后的聚合结果,无法直接被外层的SUM()处理。下面是两种可行的替代方案:
方案1:子查询写法
先通过子查询算出每个球员在2022赛季法甲中的最高市场价值,再对这些值求和:
SELECT SUM(player_highest_value) AS total_value, 'Ligue 1' AS competition_name FROM ( -- 子查询:获取每个球员在2022赛季的最高估值 SELECT p.player_id, MAX(v.market_value_in_eur) AS player_highest_value FROM Transfermarket.dbo.players$ p INNER JOIN Transfermarket.dbo.player_valuations v ON p.player_id = v.player_id INNER JOIN Transfermarket.dbo.competitions$ c ON c.competition_id = v.player_club_domestic_competition_id WHERE c.name = 'Ligue 1' AND last_season = 2022 GROUP BY p.player_id ) AS player_max_values
方案2:CTE(公共表表达式)写法
用CTE替代子查询,逻辑更清晰,可读性更强:
WITH PlayerMaxValues AS ( -- CTE:先计算每个球员在2022赛季的最高估值 SELECT p.player_id, MAX(v.market_value_in_eur) AS player_highest_value FROM Transfermarket.dbo.players$ p INNER JOIN Transfermarket.dbo.player_valuations v ON p.player_id = v.player_id INNER JOIN Transfermarket.dbo.competitions$ c ON c.competition_id = v.player_club_domestic_competition_id WHERE c.name = 'Ligue 1' AND last_season = 2022 GROUP BY p.player_id ) -- 对CTE中的结果求和 SELECT SUM(player_highest_value) AS total_value, 'Ligue 1' AS competition_name FROM PlayerMaxValues
关键说明
- 原代码问题:
SUM(MAX(p.highest_market_value_in_eur))属于嵌套聚合,SQL不支持这种写法——MAX()已经是GROUP BY后的分组聚合结果,外层SUM()无法直接处理这些分组值,必须先将分组结果作为中间数据集,再进行二次聚合。 - 字段修正:原代码中使用了
p.highest_market_value_in_eur(球员表的生涯最高估值),如果你的需求是2022赛季内的最高估值,应该改用v.market_value_in_eur(估值表的单条记录估值),再通过MAX()取每个球员在该赛季的最大值。
内容的提问来源于stack exchange,提问作者GBilianis
相关产品推荐
相关产品推荐

