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;
关键部分解释
- CTE
TargetSurveys:先筛选出所有符合条件的问卷文件,用DISTINCT确保同一个文件只被统计一次。 CROSS APPLY转列成行:把每个响应的Answer1到Answer6转换成6行数据,这样我们可以用统一的逻辑统计每个选项的选中次数,不用写6个重复的SUM(CASE...)。- 关联与分组:通过FileName关联目标问卷,通过QuestionNumber关联问题描述,最后按问题和选项分组,统计每个选项被选中(值为1)的次数。
额外说明
- 如果你的
FileName字段可能存在空值,记得在CTE里加上AND FileName IS NOT NULL避免无效数据。 - 如果需要统计未选中的次数,可以再加一列
NonSelectionCount = COUNT(CASE WHEN opt.AnswerValue = 0 THEN 1 END)。
内容的提问来源于stack exchange,提问作者user1800674
相关产品推荐
相关产品推荐

