需求:生成按用户判断问卷完成状态的SQL查询语句
解决方案
你需要按UserID、用户名、SurveyID完整分组,再通过聚合函数判断分组内是否存在跳过的问题,以此生成目标状态标识。
原始数据
| UserID | 用户名 | SurveyID | QuestionID | ResponseID | isSkipped |
|---|---|---|---|---|---|
| 1 | Test1 | 100 | 10 | 1 | 0 |
| 1 | Test1 | 100 | 20 | 2 | 0 |
| 2 | Test2 | 101 | 10 | 3 | 0 |
| 2 | Test2 | 101 | 20 | 4 | 1 |
| 3 | Test3 | 102 | 10 | 5 | 1 |
| 3 | Test3 | 102 | 20 | 6 | 1 |
期望输出
| UserID | 用户名 | SurveyID | Complete |
|---|---|---|---|
| 1 | Test1 | 100 | 0 |
| 2 | Test2 | 101 | 1 |
| 3 | Test3 | 102 | 1 |
正确SQL查询语句
SELECT UserID, 用户名, SurveyID, CASE WHEN MAX(isSkipped) = 0 THEN 0 ELSE 1 END AS Complete FROM 你的表名 GROUP BY UserID, 用户名, SurveyID;
关键说明
- 之前出现多行结果,大概率是分组字段不全,必须把
UserID、用户名、SurveyID都加入分组,才能保证每个用户的单份问卷只返回一行。 MAX(isSkipped)的逻辑:如果分组内有任何一个问题被跳过(isSkipped=1),最大值就是1,标记为未完成;所有问题都未跳过则最大值为0,标记为已完成。- 也可以用
SUM(isSkipped)替代,判断逻辑为总和等于0则已完成,否则未完成:
SELECT UserID, 用户名, SurveyID, CASE WHEN SUM(isSkipped) = 0 THEN 0 ELSE 1 END AS Complete FROM 你的表名 GROUP BY UserID, 用户名, SurveyID;
内容的提问来源于stack exchange,提问作者klaki
相关产品推荐
相关产品推荐

