You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算某列最大值的总和?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

关键说明

  1. 原代码问题:SUM(MAX(p.highest_market_value_in_eur))属于嵌套聚合,SQL不支持这种写法——MAX()已经是GROUP BY后的分组聚合结果,外层SUM()无法直接处理这些分组值,必须先将分组结果作为中间数据集,再进行二次聚合。
  2. 字段修正:原代码中使用了p.highest_market_value_in_eur(球员表的生涯最高估值),如果你的需求是2022赛季内的最高估值,应该改用v.market_value_in_eur(估值表的单条记录估值),再通过MAX()取每个球员在该赛季的最大值。

内容的提问来源于stack exchange,提问作者GBilianis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:21:36