【问题标题】:Get % of rows based on total number of rows when using GROUP BY clause in SQL Server在 SQL Server 中使用 GROUP BY 子句时根据总行数获取行数
【发布时间】:2016-02-14 11:29:16
【问题描述】:

使用此 SQL 查询:

Select CityName, count(UserID) as UserCount 
from tblUsers 
group by CityName

我得到了这些结果:

CityName    UserCount
---------------------
City 1      10
City 2      15

预期输出:

CityName    UserCount  Perc
---------------------------
City 1      10         40
City 2      15         60

根据上述数据集,我想根据 1 列的值的总和来获取行的百分比分布。请指教。

【问题讨论】:

    标签: sql sql-server database sql-server-2008


    【解决方案1】:

    尝试使用子查询来选择这样的总数:

    Select CityName,
           count(userID) as userCount,
           count(UserID)/(select count(*) from tblUsers)*100 as Perc
    from tblUsers
    group by CityName
    

    你也可以像这样尝试加入:

    SELECT t.CityName,
           t.userCount,
           t.userCount/s.totalCount*100 as Perc
    FROM (Select CityName, count(UserID) as UserCount 
          from tblUsers 
          group by CityName) t
    INNER JOIN (SELECT count(*) as totalCount from tblUsers) s
    ON(1=1)
    

    【讨论】:

    • 对于处理大约百万条记录的表的 SQL 查询会不会太重?
    • 不一定,取决于索引,列数和许多其他东西..只是测试它
    • 有效,需要将计数转换为十进制才能获得准确的结果。 :)
    • 没问题:) 如果它对你有用,我将不胜感激。 @Nitesh
    【解决方案2】:

    最简单的方法是使用窗口函数:

    Select CityName, count(UserID) as UserCount ,
           count(UserId) * 100.0 / sum(count(UserId)) over () as Perc
    from tblUsers 
    group by CityName;
    

    子查询不是必需的。

    【讨论】:

      【解决方案3】:

      不需要 Subquery/Join,只需使用 Group Sum

      Select CityName,
             count(userID) as userCount,
             100 * count(UserID)/sum(count(UserID)) over () as Perc
      from tblUsers
      group by CityName
      

      sum(count(UserID)) over () 返回所有计数的总和。

      你可以用COUNT(*)代替count(UserID)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-13
        • 2013-04-18
        • 1970-01-01
        • 2018-09-07
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多