当前位置: 代码迷 >> Sql Server >> 100分请问一条sql语句
  详细解决方案

100分请问一条sql语句

热度:45   发布时间:2016-04-24 09:07:56.0
100分请教一条sql语句
现在有表如下
学生姓名 选课科目
张三 语文
李四 英语
张三 数学
王五 政治
张三 体育
张三 美术
李四 语文
张三 英语

要求得如下结果
学生姓名              选了语文数学英语的科目数量               选了所有课程的科目数量
张三                                              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
  相关解决方案