【问题标题】:Percentage of results that have a column in SQL在 SQL 中具有列的结果的百分比
【发布时间】:2009-12-29 22:46:59
【问题描述】:

我正在尝试获得一个结果,该结果将显示独特的“原因”、它们的数量以及它们占总数的百分比。到目前为止我有

SELECT DISTINCT Reason, 
       COUNT(Reason) AS Number, 
       CAST(COUNT(Reason) AS float) / CAST(COUNT(*) AS float) AS percentage
FROM DeletedClients

但是,我发现 COUNT(*) 和 COUNT(Reason) 给出了相同的结果。所以我的基本问题是,当我在查询中使用 distinct 时,如何获得总行数? 我使用的是 SQL Server 2005

【问题讨论】:

    标签: sql select count distinct


    【解决方案1】:
    SELECT Reason, 
           COUNT(Reason) AS Number, 
           CAST(COUNT(Reason) AS float) / CAST(t.Total AS float) AS percentage
    FROM DeletedClients,
         (SELECT COUNT(*) As Total FROM DeletedClients) t
    GROUP BY Reason, Total
    

    【讨论】:

      【解决方案2】:

      用途:

      SELECT x.reason,
             x.num AS NUMBER,
             CONVERT(x.num, float)/(SELECT CONVERT(COUNT(*), float) FROM DELETEDCLIENTS) AS PERCENTAGE
        FROM (SELECT t.reason,
                     COUNT(*) 'num'
                FROM DELETEDCLIENTS t
            GROUP BY t.reason) x
      

      【讨论】:

      • 这给出了 0 作为所有行的百分比。
      • @Brian:正确 - 整数数学。已更正。
      【解决方案3】:
      select reason, count(reason), 
             (count(reason)::float / (select count(reason) from reasons)::float) * 100 
             as percent 
      from DeletedClients group by reason order by reason;
      

      这就是我想出的。我以特定于 postgresql 的方式进行了转换,但您可以根据需要进行调整。您需要使用分组依据。我添加订单只是因为我喜欢它:P

      【讨论】:

        【解决方案4】:

        我认为你应该使用 group by:

        
        SELECT Reason, 
               COUNT(Reason) AS Number, 
               CAST(COUNT(Reason) AS float) / CAST(COUNT(*) AS float) AS percentage
        FROM DeletedClients
        GROUP BY Reason
        

        【讨论】:

        • 这导致所有行的百分比为 1 (SQL Server)
        【解决方案5】:

        您的查询会出现问题。没有分组依据(如果您想返回原因列,则需要它。

        至于目标,COUNT(和其他聚合)忽略空值(如果您至少使用 SQL Server),所以这应该有效:

        DECLARE @TOTAL FLOAT
        SELECT @TOTAL = COUNT(1)
        FROM DeletedClients
        
        SELECT DISTINCT
            Reason,
            Cnt AS Number,
            @TOTAL AS TotalRecords,
            CAST(Cnt AS float) / @TOTAL AS percentage
        FROM (
            SELECT
                Reason,
                COUNT(*) AS Cnt
            FROM DeletedClients
            GROUP BY Reason
        ) t
        GROUP BY
            Reason,
            Cnt
        

        【讨论】:

          猜你喜欢
          • 2020-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多