You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL分组筛选需求:统计指定问卷集的全量问答数据

解决问卷统计需求的SQL方案

没问题,我来帮你搞定这个需求!咱们的目标很明确:先找出所有对Q53的Answer1为1的问卷文件(FileName),再基于这些文件统计Q1到Q60所有问题的各选项(Answer1-Answer6)被选中的次数,同时关联显示问题编号和描述。

核心思路

你之前的筛选方式只返回指定问题的单行数据,大概率是因为直接过滤了SurveyQuestionNumber = 53,而我们需要先拿到符合条件的问卷文件集合,再用这个集合去过滤所有问卷响应,最后统计所有问题的选项数据。

完整SQL查询

WITH TargetSurveys AS (
    -- 第一步:获取所有满足Q53 Answer1=1的问卷文件(去重避免重复统计)
    SELECT DISTINCT FileName
    FROM [dbo].[SurveyResponses]
    WHERE SurveyQuestionNumber = 53 AND Answer1 = 1
)
SELECT
    sq.QuestionNumber,
    sq.Description,
    OptionNumber = 'Answer' + CAST(opt.OptionId AS VARCHAR(1)),
    SelectionCount = COUNT(CASE WHEN opt.AnswerValue = 1 THEN 1 END)
FROM [dbo].[SurveyResponses] sr
-- 只保留目标问卷文件的响应数据
INNER JOIN TargetSurveys ts ON sr.FileName = ts.FileName
-- 关联问题表获取描述
INNER JOIN [dbo].[SurveyQuestions] sq ON sr.SurveyQuestionNumber = sq.QuestionNumber
-- 把Answer1-6列转成行数据,方便统一统计
CROSS APPLY (
    VALUES
        (1, sr.Answer1),
        (2, sr.Answer2),
        (3, sr.Answer3),
        (4, sr.Answer4),
        (5, sr.Answer5),
        (6, sr.Answer6)
) opt(OptionId, AnswerValue)
-- 限定只统计Q1-Q60的问题
WHERE sq.QuestionNumber BETWEEN 1 AND 60
-- 按问题编号和选项分组统计
GROUP BY sq.QuestionNumber, sq.Description, opt.OptionId
-- 按问题编号+选项排序,结果更清晰
ORDER BY sq.QuestionNumber, opt.OptionId;

关键部分解释

  1. CTE TargetSurveys:先筛选出所有符合条件的问卷文件,用DISTINCT确保同一个文件只被统计一次。
  2. CROSS APPLY转列成行:把每个响应的Answer1到Answer6转换成6行数据,这样我们可以用统一的逻辑统计每个选项的选中次数,不用写6个重复的SUM(CASE...)。
  3. 关联与分组:通过FileName关联目标问卷,通过QuestionNumber关联问题描述,最后按问题和选项分组,统计每个选项被选中(值为1)的次数。

额外说明

  • 如果你的FileName字段可能存在空值,记得在CTE里加上AND FileName IS NOT NULL避免无效数据。
  • 如果需要统计未选中的次数,可以再加一列NonSelectionCount = COUNT(CASE WHEN opt.AnswerValue = 0 THEN 1 END)。

内容的提问来源于stack exchange,提问作者user1800674

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:23:37