Ali*_*ith 4 sql sql-server optimization
我有一个(SQL Server)表类似于以下内容:
SalesSummary
年| 团队| 人| 人员销售| 团队销售/年
2013年1吉姆10美元?
2013 1 Anna $ 0 ??
2013 2约翰8美元?
2013 3 Todd $ 4 ??
2013 3 Alan 3美元?
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
Run Code Online (Sandbox Code Playgroud)
我希望有人能够证明如何最好地执行此类更新.我感谢任何帮助,提示或示例.如果这是显而易见的,请道歉.
假设您使用的是SQL Server,我想您需要这样的东西:
WITH toupdate AS
(SELECT team, year,
Sum(personsales) OVER (partition BY team, year) AS newTeamSales
FROM salessummary
)
UPDATE toupdate
SET teamsales = newteamsales;
Run Code Online (Sandbox Code Playgroud)
您的原始查询有几个问题和可疑的结构.首先,聚合子查询不可更新.其次,您正在进行聚合并使用窗口函数,尽管允许,但这种情况并不常见.第三,你正在聚合PersonSales并采取sum().再一次,允许,但不寻常.
试试这个.
UPDATE SalesSummary SET TeamSales = (Select Sum(PersonSales)
From SalesSummary S
Where S.Year=SalesSummary.Year AND S.Team=SalesSummary.Team)
Run Code Online (Sandbox Code Playgroud)