SQL出现次数百分比

时间:2015-04-28 18:02:16

标签: sql sql-server

我正在研究一些SQL代码作为我大学工作的一部分。数据是人为的,只是为了清楚。我试图计算1&的出现次数。 SQL表0中的Fact_Stream,它作为布尔值/位值存储在Free_Stream列/属性中。

由于计算不能用于比特值(至少在我正在尝试的方式),我已经将值转换为整数 - 只是为了清楚。该表包含有关流媒体公司流的信息,1表示该流是免费的,0表示该流已付费。我的代码:

SELECT Fact_Stream.Free_Stream, ((CAST(Free_Stream AS INT)) / COUNT(*) * 100) As 'Percentage of Streams'
FROM Fact_Stream
GROUP BY Free_Stream

结果/输出几乎是我想要的,但它没有正确显示百分比。

输出:

enter image description here

使用MS SQL Management Studio | MS SQL Server 2012(我相信)

3 个答案:

答案 0 :(得分:2)

百分比应基于所有行,因此您需要将每1/0的计数除以所有行的计数。最简单的方法是使用窗口聚合函数:

SELECT Fact_Stream.Free_Stream,
   100.0 * COUNT(*)        -- count per bit
   / SUM(COUNT(*)) OVER () -- sum of those counts = count of all rows
   As "Percentage of Streams"
FROM Fact_Stream
GROUP BY Free_Stream

答案 1 :(得分:1)

你有INT作为一名嫌疑人并且已经离开(不确定我是否正确)。结果也是INT。只需将其中一个转换为十进制(注意我是如何更改为100.0)。您还应该将组中元素的数量与表格中的总行数进行比较:

select Free_Stream, 
       (count(*) / (select count(*) from Free_Stream)) * 100.0 as 'Percentage of Streams'
from Fact_Stream
group by Free_Stream

答案 2 :(得分:0)

您的公式是将标识符(1或0)除以每个标识符的流数,而不是将总计数除以空闲或支付的数量。一种方法是首先获取总计数,然后在查询中使用它:

declare @totalcount real;
select @totalcount = count(*) from Fact_Stream;

SELECT Fact_Stream.Free_Stream, 
    (Cast(Count(*) as real) / @totalcount)*100 AS 'Percentage of Streams'
FROM Fact_Stream
group by Fact_Stream.Free_Stream