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]