按SQL Server中的总计百分比分组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按SQL Server中的总计百分比分组相关的知识,希望对你有一定的参考价值。

我有一个带有一列Items的SQL表,我希望以desc顺序显示每个项目的总计数百分比。

例如

Column A
Item 1
Item 1
Item 2
Item 3

我想展示:

Column A
Item 1   0.5
Item 2   0.25
Item 3   0.25

到目前为止,我尝试了以下内容:

SELECT [Column A], (count([Column A]) / count(*))
  FROM [table]
  GROUP BY [Column A]
  Order by (count([Column A]) / count(*)) DESC

然而,一切都回来了1。

答案

您可以在主查询中通过qazxsw poi列尝试qazxsw poi group。然后在子查询中做总COUNT做除法。

[Column A]

count

或者你可以使用CREATE TABLE T( [Column A] VARCHAR(50) ); INSERT INTO T VALUES ('Item 1'); INSERT INTO T VALUES ('Item 1'); INSERT INTO T VALUES ('Item 2'); INSERT INTO T VALUES ('Item 3'); SELECT [Column A],COUNT(*) /CAST ((SELECT COUNT(*) FROM T) AS FLOAT) FROM T GROUP BY [Column A] 得到总数然后做除法。

sqlfiddle
另一答案

您的问题是您的聚合应用于分组列,无论如何,您需要以某种方式单独获取总数。一种方法是使用派生表和@ D-Shih一样。我只是将它存储在一个变量中。

您遇到的另一个问题是您的操作数都是INT,因此SQL Server会推断出结果的INT数据类型。你只需要一个操作数就不返回整数数据类型。我使用了精确的数值数据类型,因为如果稍后您需要将单个%求和得到100%,则近似数字可能会导致问题。

CROSS JOIN
另一答案

我认为Window函数是这种情况的更好解决方案,因为该表只读一次。

如果不是一个百分比,你必须创建百分比,平均值和总和?或者查询比单个计数更复杂?创建许多子查询不是一种选择。所以,这就是我更喜欢窗口函数而不是子查询的原因。

SELECT [Column A],COUNT(*) /CAST(total AS FLOAT) FROM T CROSS JOIN (SELECT COUNT(*) total FROM T) v GROUP BY [Column A],total

DECLARE @t_item TABLE
(       name VARCHAR(10)
)

DECLARE @total_count NUMERIC(3,2)

INSERT INTO @t_item
VALUES ('ITEM1'),
       ('ITEM1'),
       ('ITEM2'),
       ('ITEM3'),
       ('ITEM3'),
       ('ITEM1')

SELECT @total_count = COUNT(*) FROM @t_item

SELECT name,
       COUNT(name),
       COUNT(*),
       pct_of_all      = CONVERT(NUMERIC(3,2),COUNT(name))/CONVERT(NUMERIC(3,2),COUNT(*))
  FROM @t_item
 GROUP BY name


SELECT name,
       COUNT(name),
       @total_count,
       pct_of_all      = COUNT(name)/@total_count
  FROM @t_item
 GROUP BY name

以上是关于按SQL Server中的总计百分比分组的主要内容,如果未能解决你的问题,请参考以下文章

NetSuite 已保存搜索 - 使用分组时显示总计/计算百分比

按 ID 分组的 SQL 运行总计

SQL如何对分组后的结果进行排序并且取前几名

在 SQL Server 中的计算列上运行总计

SQL Server Reporting Services 在聚合数据上运行总计

Sql Server - 查询帮助(按 MAX 分组)