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,完成:计算全体学生某门功课的平均成绩