【问题标题】:Using Over() with aggregate functions while calculating percentage在计算百分比时将 Over() 与聚合函数一起使用
【发布时间】:2021-03-24 12:04:00
【问题描述】:

我正在编写一个查询来打印大学每个部门的学生总数,我还想打印每个部门的学生占大学学生总数的百分比。

select dep.[Id] as DepId, dep.[Name] as Department, COUNT(s.[Id]) as [TotalStudents]
    , COUNT(S.[Id]) * 100/NULLIF(COUNT(COUNT(S.[Id]) OVER(), 0) AS [Percentage]
from dbo.[Department] dep
left join dbo.[student] s on dep.[Id] = s.[DepartmentId]
group by dep.[Id], dep.[Name]

计算百分比有问题,上面的查询抛出错误

dbo.Student.Id 在选择列表中无效,因为它不包含在任一聚合函数中。

如果所有部门共有 10 名学生,而 Dep1 有 5 名学生,则百分比应为 50。

【问题讨论】:

    标签: sql sql-server count aggregate-functions percentage


    【解决方案1】:

    您可以使用类似的窗口函数,但您需要一个计数窗口SUM,而不是窗口COUNT()。我还建议在计算中输入一个十进制值,以避免整数除法:

    select d.[Id] as DepId, d.[Name] as Department, 
        count(s.[Id]) as [TotalStudents], 
        count(s.[Id]) * 100.0 / nullif(sum(count(s.[Id])) over(), 0) AS [Percentage]
    from dbo.[Department] d
    left join dbo.[student] s on d.[Id] = s.[DepartmentId]
    group by d.[Id], d.[Name]
    

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 2012-01-20
      • 2014-12-24
      • 2017-04-28
      • 2019-09-20
      • 1970-01-01
      • 2015-10-03
      • 2022-01-12
      • 2020-03-19
      相关资源
      最近更新 更多