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

SQL中CASE WHEN结合SUM统计课程类型异常问题求助

课程表数据
课程名称章节号课程类型
MATH 1011In person
MATH 1012In person
MATH 1013Online
MATH 1014In person
SOC 1011In person
SOC 1012In person
SOC 1013In person
ENGL 2011In person
ENGL 2012Online
ENGL 2013Online
ENGL 2014In person
PHY 1011Online
PHY 1012Online

统计需求

统计三类课程的数量:

  • 仅包含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

预期结果

bothtypeOnlineonlyInpersononly
211

实际结果

bothtypeOnlineonlyInpersononly
076

修正后的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;

修正说明

  1. 原SQL的核心问题:

    • 未按课程分组,直接统计全表章节的类型数量,而非课程数量
    • 单条记录的课程类型只能是一种,coursetype = 'Inperson' AND coursetype = 'Online'的条件永远不成立
    • 拼写错误:实际课程类型是In person(带空格),原SQL写成了Inperson
  2. 修正逻辑:

    • 子查询按课程名称分组,用MAX()标记每门课程是否包含两种类型
    • 外层查询基于子查询的标记结果,统计三类课程的数量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:25:30