我正在研究一些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
结果/输出几乎是我想要的,但它没有正确显示百分比。
输出:
使用MS SQL Management Studio | MS SQL Server 2012(我相信)
答案 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