【问题标题】:SQL Percentage of OccurrencesSQL 出现百分比
【发布时间】:2015-04-28 18:02:15
【问题描述】:

作为我大学工作的一部分,我正在编写一些 SQL 代码。为了清楚起见,数据是人为的。我正在尝试计算 SQL 表 Fact_Stream10 的出现次数,这作为布尔值/位值存储在 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(我相信)

【问题讨论】:

  • 您的等式是将标识符(1 或 0)除以每个流的数量,而不是将免费或付费的数量除以总数量
  • 您好,感谢您的评论@JenR,我明白您的意思,但我不知道如何将其放入 SQL 中??

标签: sql sql-server


【解决方案1】:

百分比应基于所有行,因此您需要将每 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

【讨论】:

    【解决方案2】:

    你有 INTs 作为 devisor 和 devided(不确定我的命名是否正确)。所以结果也是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
    

    【讨论】:

      【解决方案3】:

      您的等式是将标识符(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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多