Rya*_*don 9 sql sql-server join sum percentage
我有这些结果:
PersonID SUM(PA.Total)
-------------------------
1 75
2 75
3 15
4 15
5 60
6 60
Run Code Online (Sandbox Code Playgroud)
用表如:
PersonID Total
------------------
1 50
2 50
3 10
4 10
5 40
6 40
1 25
2 25
3 5
4 5
5 20
6 20
Run Code Online (Sandbox Code Playgroud)
这些按人分组.现在我想添加一个列,其中每个人的百分比是根据他们所有总和的总和来计算的.
例如:总和是300,因此我需要这样的结果:
PersonID SUM(PA.Total) Percentage
--------------------------------------
1 75 25%
2 75 25%
3 15 5%
4 15 5%
5 60 20%
6 60 20%
Run Code Online (Sandbox Code Playgroud)
我已经在线查看了代码,我提出了一个像这样的修复程序:
SELECT
P.PersonID, SUM(PA.Total)
SUM(PA.Total) * 100 / [p] AS 'Percentage'
FROM
Person P
JOIN
Package PA ON P.PersonID = PA.PackageFK
CROSS JOIN
(SELECT SUM(PA.[Total]) AS [p]
FROM Package PA) t
GROUP BY
P.PersonID
Run Code Online (Sandbox Code Playgroud)
但我不确定如何将交叉连接合并到连接以及已经组/ sum部分.或者这是否完全沿着正确的路线.
任何帮助将不胜感激 - SQL小提琴http://sqlfiddle.com/#!9/80f91/2
Gor*_*off 21
你不需要cross join.只需使用窗口功能:
SELECT P.PersonID, SUM(PA.Total),
SUM(PA.Total) * 100.0 / SUM(SUM(PA.Total)) OVER () AS Percentage
FROM Person P JOIN
Package PA
ON P.PersonID = PA.PackageFK
GROUP BY P.PersonID;
Run Code Online (Sandbox Code Playgroud)
请注意,您不需要JOIN此查询:
SELECT PA.PersonID, SUM(PA.Total),
SUM(PA.Total) * 100.0 / SUM(SUM(PA.Total)) OVER () AS Percentage
FROM Package PA
GROUP BY PA.PersonID;
Run Code Online (Sandbox Code Playgroud)
SQL Server执行整数除法.我使用十进制数进行这样的计算,因此它们更有意义.
这是一个SQL小提琴,有两个变化: