SQL Server 使用窗口函数计算 AVG()

Posted

技术标签:

【中文标题】SQL Server 使用窗口函数计算 AVG()【英文标题】:SQL Server calculate AVG() using window functions 【发布时间】:2020-12-04 14:47:22 【问题描述】:

我需要为调查申请创建一份报告,调查表有 10 个问题,每个问题有 4 个选项。

我的报告应显示问题名称、选项、选择该选项的用户总数、选择该选项的用户百分比

我在计算百分比时遇到问题,因为我的百分比应该是用户总数的百分比,仅按问题而不是整个 TotalUsers 列

Select V.[Question] as [Question], O.[Option] AS [Option], 
(SELECT COUNT(R.[ResponseId]) FROM dbo.[Response] R 
LEFT JOIN dbo.[Employee] E ON R.[EmployeeId] = R.[EmployeeId]
WHERE R.[OptionId] = O.[OptionId] AND E.[IsActive] = 1 AND E.[RoleId] = @RoleId) 
AS [TotalUsers]
FROM    dbo.[VitalSignQuestions] V
LEFT JOIN   dbo.[VitalSurveyOptions] O ON   V.[QuestionId] = O.[QuestionId]

[TotalUsers] 是从子查询中计算出来的

【问题讨论】:

你说的是平均,但我认为你的意思是百分比 我的错是它的百分比 【参考方案1】:

没有测试,但我认为这是您需要的。

首先加入Employee的条件有错误:LEFT JOIN dbo.[Employee] E ON R.[EmployeeId] = R.[EmployeeId],所以我修复了这个 第二,尝试重新格式化您的查询,这是最终的,让我知道它是否有效:
SELECT
    V.[Question] AS [Question]
    , O.[Option] AS [Option]
    , COUNT(R.[ResponseId]) AS [TotalUsers]
    , COUNT(R.[ResponseId]) * 100 / (SELECT COUNT(*) FROM  dbo.[VitalSignQuestions] v2 WHERE v2.[QuestionId] = V.[QuestionId]) AS [Percentage]
FROM
    dbo.[VitalSignQuestions]           V
    LEFT JOIN dbo.[VitalSurveyOptions] O
        ON V.[QuestionId] = O.[QuestionId]
    LEFT JOIN dbo.[Response]           R
        ON R.[OptionId] = O.[OptionId]
    LEFT JOIN dbo.[Employee]           E
        ON R.[EmployeeId] = E.[EmployeeId]
           AND E.[IsActive] = 1
           AND E.[RoleId] = @RoleId
GROUP BY
V.[Question]
, O.[Option]

【讨论】:

以上是关于SQL Server 使用窗口函数计算 AVG()的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER数据库编程:创建并执行用户自定义函数Avg_grade,完成:计算全体学生某门功课的平均成绩

SQL Server的各种聚合函数

SQL Server2008窗口计算

SQL Server 2012 Windowing 函数计算运行总计

SQL Server中的开窗函数是啥?

从 SQL 窗口函数中排除分区?