SQL中CASE WHEN结合SUM统计课程类型异常问题求助
课程表数据
| 课程名称 | 章节号 | 课程类型 |
|---|---|---|
| MATH 101 | 1 | In person |
| MATH 101 | 2 | In person |
| MATH 101 | 3 | Online |
| MATH 101 | 4 | In person |
| SOC 101 | 1 | In person |
| SOC 101 | 2 | In person |
| SOC 101 | 3 | In person |
| ENGL 201 | 1 | In person |
| ENGL 201 | 2 | Online |
| ENGL 201 | 3 | Online |
| ENGL 201 | 4 | In person |
| PHY 101 | 1 | Online |
| PHY 101 | 2 | Online |
统计需求
统计三类课程的数量:
- 仅包含
In person类型的课程 - 仅包含
Online类型的课程 - 同时包含两种类型的课程
错误的SQL语句
SELECT SUM(CASE WHEN coursetype = 'Inperson' AND coursetype = 'Online' THEN 1 ELSE 0 END) AS bothtype, SUM(CASE WHEN coursetype = 'Online' THEN 1 ELSE 0 END) AS Onlineonly, SUM(CASE WHEN coursetype = 'Inperson' THEN 1 ELSE 0 END) AS Inpersononly From Course
预期结果
| bothtype | Onlineonly | Inpersononly |
|---|---|---|
| 2 | 1 | 1 |
实际结果
| bothtype | Onlineonly | Inpersononly |
|---|---|---|
| 0 | 7 | 6 |
修正后的SQL语句
SELECT SUM(CASE WHEN has_inperson = 1 AND has_online = 1 THEN 1 ELSE 0 END) AS bothtype, SUM(CASE WHEN has_online = 1 AND has_inperson = 0 THEN 1 ELSE 0 END) AS Onlineonly, SUM(CASE WHEN has_inperson = 1 AND has_online = 0 THEN 1 ELSE 0 END) AS Inpersononly FROM ( SELECT 课程名称, MAX(CASE WHEN 课程类型 = 'In person' THEN 1 ELSE 0 END) AS has_inperson, MAX(CASE WHEN 课程类型 = 'Online' THEN 1 ELSE 0 END) AS has_online FROM Course GROUP BY 课程名称 ) AS course_types;
修正说明
原SQL的核心问题:
- 未按课程分组,直接统计全表章节的类型数量,而非课程数量
- 单条记录的课程类型只能是一种,
coursetype = 'Inperson' AND coursetype = 'Online'的条件永远不成立 - 拼写错误:实际课程类型是
In person(带空格),原SQL写成了Inperson
修正逻辑:
- 子查询按课程名称分组,用
MAX()标记每门课程是否包含两种类型 - 外层查询基于子查询的标记结果,统计三类课程的数量
- 子查询按课程名称分组,用
内容的提问来源于stack exchange,提问作者Sungmin Kim
相关产品推荐
相关产品推荐

