按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 已保存搜索 - 使用分组时显示总计/计算百分比