Sql 如何在选定列位于同一查询中的情况下添加聚合函数

Sql 如何在选定列位于同一查询中的情况下添加聚合函数,sql,sql-server,Sql,Sql Server,我希望包含以下代码行以执行计算: SUM((InitialTeamWeight / 10) * Form + InitialTeamWeight) AS FinalTeamWeight 但问题是我不能调用同一SELECT语句中的列。我尝试在这个查询上面添加一个子查询来选择上面的计算,但是这会对所有团队而不是单个团队执行计算 我需要做什么才能将计算添加到查询中,而不会出现未定义列的问题 以下是当前查询: SELECT TeamID, CASE WHEN TeamID = 0 THEN 0

我希望包含以下代码行以执行计算:

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

现在还不是100%清楚你想做什么,但我猜你有团队重量,现在想在你的公式中使用它作为初始团队重量

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


我不确定这是否是您所需要的,但它可能会有所帮助。

您想要做什么还不是100%清楚,但我猜您有团队重量,现在想在公式中使用它作为初始团队重量

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


我不确定这是否是您所需要的,但可能会有所帮助

这根本不清楚问题是什么。标题是关于多个cte的,但这里不需要它们…这里没有足够的select语句来包含多个cte。您可以将子查询移动到cte,但如果这已经起作用,则不会有多大区别。执行计划将是相同的。@SeanLange我在其中计算了2个子查询,理论上可能是CTE'd,但你是对的,实际问题并不清楚。OP请添加您的表结构,或者更好,提供一个@ChrisPickford,我想其中有两个:我将问题改为简单地说明如何在没有未定义列的情况下将总和添加到查询中我猜您需要在最内部的查询中添加这些列。这根本不清楚问题是什么。标题是关于多个cte的,但这里不需要它们…这里没有足够的select语句来包含多个cte。您可以将子查询移动到cte,但如果这已经起作用,则不会有多大区别。执行计划将是相同的。@SeanLange我在其中计算了2个子查询,理论上可能是CTE'd,但你是对的,实际问题并不清楚。OP请添加您的表结构,或者更好,提供一个@ChrisPickford,我想其中有两个:我将问题改为简单地说明如何在没有未定义列的情况下将总和添加到查询中我猜您需要在最内部的查询中添加这些列。
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