现在有表如下
学生姓名 选课科目
张三 语文
李四 英语
张三 数学
王五 政治
张三 体育
张三 美术
李四 语文
张三 英语
要求得如下结果
学生姓名 选了语文数学英语的科目数量 选了所有课程的科目数量
张三 3 5
李四 2 2
王五 0 1
------解决思路----------------------
SELECT 学生姓名
,SUM(CASE WHEN 选课科目 IN('语文','数学','英语')THEN 1 ELSE 0 END)[选了语文数学英语的科目数量]
,SUM(1)[选了所有课程的科目数量]
FROM 表名
------解决思路----------------------
WITH table1(学生姓名,选课科目) AS (
SELECT '张三','语文' UNION ALL
SELECT '李四','英语' UNION ALL
SELECT '张三','数学' UNION ALL
SELECT '王五','政治' UNION ALL
SELECT '张三','体育' UNION ALL
SELECT '张三','美术' UNION ALL
SELECT '李四','语文' UNION ALL
SELECT '张三','英语'
)
,t1 AS (
SELECT 学生姓名,COUNT(*) c
FROM table1
WHERE 选课科目 IN ('语文','数学','英语')
GROUP BY ALL 学生姓名
)
,t2 AS (
SELECT 学生姓名,COUNT(*) c
FROM table1
GROUP BY 学生姓名
)
SELECT t1.学生姓名,
t1.c AS 选了语文数学英语的科目数量,
t2.c AS 选了所有课程的科目数量
FROM t1
JOIN t2
ON t1.学生姓名 = t2.学生姓名
学生姓名 选了语文数学英语的科目数量 选了所有课程的科目数量
-------- -------------------------- ----------------------
李四 2 2
王五 0 1
张三 3 5