【问题标题】:SQL Server calculate AVG() using window functionsSQL Server 使用窗口函数计算 AVG()
【发布时间】: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] 是从子查询中计算出来的

【问题讨论】:

  • 你说的是平均,但我认为你的意思是百分比
  • 我的错是它的百分比

标签: sql-server average window-functions


【解决方案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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2018-01-03
    • 2013-04-06
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    相关资源
    最近更新 更多