如何添加聚合函数,其中所选列位于同一查询中

时间:2016-06-17 13:09:53

标签: sql sql-server

我想包含以下代码行来执行计算:

SUM((InitialTeamWeight / 10) * Form + InitialTeamWeight) AS FinalTeamWeight

但问题是我无法调用同一SELECT语句中的列。我尝试在此查询上方添加一个子查询,选择上述计算,但这会为所有团队而不是单个团队执行计算。

如果要将计算添加到查询中而不出现未定义列的问题,我需要做些什么?

以下是当前查询:

SELECT TeamID,
    CASE WHEN TeamID = 0 THEN 0 
    ELSE SUM(po.playerWeighting)
    END TeamWeight
    --ABS(CHECKSUM(NewID())) % 10 + 1 AS Form
-- cte    
FROM(
        SELECT pl.*,
               ROW_NUMBER() OVER(PARTITION BY pl.TeamID, pl.Position ORDER BY NEWID()) AS Rnk
-- cte        
        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

1 个答案:

答案 0 :(得分:0)

我不是100%清楚你要做的是什么,但我猜你有TeamWeight,现在想在你的公式中使用InitialTeamWeight

我添加了2个CTE(可能会帮助您使用CTE的语法)并从主查询中删除CASE。如果CTE中playerWeighting为0,则TeamID设置为0,这导致TeamId = 0的总和相同

WITH pl AS (SELECT DISTINCT p.PlayerID
                            p.Position
                            ,CASE WHEN p.TeamID = 0 THEN 0
                                  ELSE p.playerWeighting END AS 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)
,po AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY pl.TeamID, pl.Position ORDER BY NEWID()) AS Rnk FROM pl)
SELECT TeamID
    ,SUM(po.playerWeighting) AS TeamWeight
    ,SUM((SUM(po.playerWeighting) / 10) * Form + SUM(po.playerWeighting)) AS FinalTeamWeight
    --ABS(CHECKSUM(NewID())) % 10 + 1 AS Form
FROM 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

我不确定这是否是你需要的,但也许有帮助