GROUP BY SQL Server之后的总SUM的百分比

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小提琴,有两个变化:

  1. 数据库已更改为SQL Server.
  2. 总数存储为数字而不是字符串.

  • 不错,SUM(SUM(PA.Total))OVER() (2认同)