【问题标题】:group by aggregate functions按聚合函数分组
【发布时间】:2016-06-15 20:17:41
【问题描述】:

我正在尝试执行 GROUP BY 'TeamID',但在插入 GROUP BY 子句后出现以下错误:

选择列表中的“po.PlayerWeighting”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

我应该将 GROUP BY 子句放在哪里才能工作,它将所有团队权重分组到 TeamID?

SELECT DISTINCT TeamID,
    CASE WHEN TeamID = 0 THEN 0 
    ELSE SUM(po.playerWeighting) OVER(PARTITION BY po.TeamID)
    END TeamWeight,
    ABS(CHECKSUM(NewID())) % 10 + 1 AS Form
    FROM(
        SELECT pl.*,
               ROW_NUMBER() OVER(PARTITION BY pl.TeamID, pl.Position ORDER BY NEWID()) AS Rnk
        FROM(
            SELECT DISTINCT p.PlayerID, p.Position, p.PlayerWeighting, p.FirstName, p.Surname, t.TeamID, t.TeamAbbreviation, f.WeekNumber
            FROM dbo.Fixture f
            INNER JOIN dbo.League l ON f.LeagueID = l.LeagueID
            INNER JOIN dbo.Team t ON l.LeagueID = t.LeagueID
            INNER JOIN dbo.Player p ON t.TeamID = p.TeamID
            WHERE f.WeekNumber = 1) 
            pl) po 
    WHERE (po.Position = 'GK' and po.rnk = 1) OR 
          (po.Position = 'DF' and po.rnk <= 4) OR
          (po.Position = 'MF' and po.rnk <= 4) OR
          (po.Position = 'FW' and po.rnk <= 2)
          GROUP BY TeamID

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    GROUP BY之后不需要DISTINCTSUM() OVER()是不必要的,因为已经有GROUP BY TeamID

    SELECT TeamID,
        CASE WHEN TeamID = 0 THEN 0 
        ELSE SUM(po.playerWeighting)
        END TeamWeight,
        ABS(CHECKSUM(NewID())) % 10 + 1 AS Form
        FROM
        ((...) po
        ) t
    WHERE ...
    GROUP BY TeamID
    

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 2017-04-22
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      相关资源
      最近更新 更多