SQL 服务器使用 window 函数计算 AVG()
SQL Server calculate AVG() using window functions
我需要为调查申请创建报告,调查表有 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] 是根据子查询计算的
没有测试,但我想这就是你需要的。
- 首先在加入 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]
我需要为调查申请创建报告,调查表有 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] 是根据子查询计算的
没有测试,但我想这就是你需要的。
- 首先在加入 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]