GROUP BY SQL Server 后总和的百分比

新手上路,请多包涵

我有这些结果:

 PersonID    SUM(PA.Total)
-------------------------
   1            75
   2            75
   3            15
   4            15
   5            60
   6            60

像这样的表:

 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

这些是按人分组的。现在我希望添加一个列,其中每个人的百分比是根据他们所有的总和计算得出的。

例如:总和是 300,因此我需要这样的结果:

 PersonID    SUM(PA.Total)   Percentage
--------------------------------------
   1            75              25%
   2            75              25%
   3            15              5%
   4            15              5%
   5            60              20%
   6            60              20%

我在网上查看了代码,并想出了一个修复方法,例如:

  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

但我不确定如何将交叉连接合并到连接以及已经组/总和部分。或者这是否完全正确。

任何帮助将不胜感激 - SQL fiddle http://sqlfiddle.com/#!9/80f91/2

原文由 Ryan Gadsdon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 695
2 个回答

您不需要 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;

请注意,对于此查询,您不需要 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;

SQL Server 进行整数除法。我使用十进制数字进行此类计算,因此它们更有意义。

是一个 SQL Fiddle,有两个变化:

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

原文由 Gordon Linoff 发布,翻译遵循 CC BY-SA 3.0 许可协议

简单

SELECT P.PersonID, SUM(PA.Total),
       SUM(PA.Total) * 100.0 / (SELECT SUM(PA.Total) FROM PA)
FROM Person P JOIN
     Package PA
     ON P.PersonID = PA.PackageFK
GROUP BY P.PersonID;

没有 JOIN

 SELECT PA.PersonID, SUM(PA.Total),
       SUM(PA.Total) * 100.0 / (SELECT SUM(PA.Total) FROM PA)
FROM Package PA
GROUP BY PA.PersonID;

原文由 Vishal Singh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进