SQL如何在同一个表中更新列的组的SUM

时间:2014-02-19 04:42:22

标签: sql sql-server optimization

我有一个类似于以下内容的(SQL Server)表:

SalesSummary

年|团队|人|人员销售|团队销售/年

2013 1 Jim $ 10 ??

2013 1 Anna $ 0 ??

2013 2 John $ 8 ??

2013 3 Todd $ 4 ??

2013 3 Alan $ 1 ??

2014 3 Alan $ 22 ??

我正在尝试总结此示例SalesSummary表并将正确的值插入Team Sales列。在这个例子中,我希望第1和第2列为10美元,第3列为8美元,第4/5为5美元,第6列为22美元。请原谅我对SQL的无知,但我确定了我所说的是一个糟糕的解决方案如下:

UPDATE SalesSummary SET TeamSales = sum.TeamSales
FROM (SELECT Team, Year, SUM(PersonSales) OVER (Partition By Team, Year) as TeamSales)
      FROM SalesSummary
      GROUP BY Team, Year, PersonSales
     ) AS sum, SalesSummary as SS
WHERE sum.Team = ss.Team AND sum.Year = ss.Year

我希望有人能够证明如何最好地执行此类更新。我感谢任何帮助,提示或示例。如果这很明显,请道歉。

3 个答案:

答案 0 :(得分:9)

假设您使用的是SQL Server,我认为您需要这样的内容:

WITH toupdate AS
     (SELECT team, year, 
             Sum(personsales) OVER (partition BY team, year) AS newTeamSales 
      FROM salessummary
     ) 
UPDATE toupdate 
   SET teamsales = newteamsales; 

您的原始查询有几个问题和可疑构造。首先,聚合子查询不可更新。其次,您正在进行聚合并使用窗口函数,尽管允许,但这种情况并不常见。第三,您按PersonSales汇总并取sum()。再一次,允许,但不寻常。

答案 1 :(得分:6)

试试这个。

UPDATE  SalesSummary SET TeamSales = (Select Sum(PersonSales) 
        From    SalesSummary S 
        Where S.Year=SalesSummary.Year AND S.Team=SalesSummary.Team)

答案 2 :(得分:0)

我有一个表变量而不是常规表,因此我需要对@Shell的answer进行一些修改-因此,当表是变量时,我的问题解决方案是:

Update SU
Set TeamSales = (Select Sum(SI.PersonSales) 
                 From   @SalesSummary SI 
                 Where  SI.Year=SU.Year AND SI.Team=SU.Team)
From @SalesSummary SU