当前位置: 首页 > 面试题库 >

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

闽承望
2023-03-14
问题内容

我有这些结果:

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小提琴http://sqlfiddle.com/#!9/80f91/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. 总数存储为数字而不是字符串。


 类似资料:
  • 这显然很简单,但作为一个新手,我被卡住了。 我有一个CSV文件,其中包含3列:州、办公室ID和该办公室的销售额。 我想计算给定州每个办公室的销售额百分比(每个州所有百分比的总和为100%)。 这返回: 我似乎不知道如何“达到”级别,以总计整个的来计算分数。

  • 问题内容: 这显然很简单,但是作为一个笨拙的新手,我陷入了困境。 我有一个包含3列的CSV文件,分别是该办公室的州,办公室ID和销售。 我想计算给定状态下每个办公室的销售百分比(每个州的所有百分比的总和为100%)。 返回: 我似乎无法弄清楚如何“高达”的水平与总起来对整个计算分数。 问题答案: 你将不得不创建第二个对象,但是你可以以一种更简单的方式来计算百分比-仅计算并将该列除以其和即可。复制P

  • 问题内容: 我有一个MSSQL表存储,该存储在表中具有以下列: 有人可以帮我进行SQL查询,以产生占雇员总数(NumEmployees)30%的顶级商店(storeID)吗? 问题答案: WITH cte AS (SELECT storeid, numemployees, ( numemployees * 100 ) / SUM(numemployees) OVER (PARTITION BY 1

  • 问题内容: 样品表 在上面的示例记录中,我想找出客户凭证涵盖的总月数 我需要形式的输出 问题在于,凭证可以有多行用于不同的CategoryIds … 我计算出凭证涵盖的月份为DATEDIFF(MM,StartDate,EndDate)+1 … 当我应用SUM(DATEDIFF(MM,StartDate,EndDate))GROUP BY VoucherId,StartDate,EndDate时,由

  • 我在普罗米修斯有一个直方图,在格拉法纳,我试图得到一个标签的计数随时间的百分比分布的图表。我目前正在尝试类似于 但它没有返回任何值。我做错什么了吗?我只想要label2每个值的计数总和,除以计数总和。

  • 问题内容: 我有这个查询: 它给了我每一行的计数。现在,我想添加第三列,这将给我带来帮助。 我怎样才能做到这一点? 问题答案: 您可以使用子查询来做到这一点: 或带有变量: 在两个示例中,我都将count(*)转换为实数,以避免整数除法类型问题。 希望这对约翰有帮助