SQL中Case的妙用(四)

六,在Case函数中使用合计函数 

假设有下面一个表

学号(std_id)

课程ID(class_id)

课程名(class_name)

主修flag(main_class_flg)

100

1

经济学

Y

100

2

历史学

N

200

2

历史学

N

200

3

考古学

Y

200

4

计算机

N

300

4

计算机

N

400

5

化学

N

500

6

数学

N


有的学生选择了同时修几门课程(100,200)也有的学生只选择了一门课程(300,400,500)。选修多门课程的学生,要选择一门课程作为主修,主修flag里面写入 Y。只选择一门课程的学生,主修flag为N(实际上要是写入Y的话,就没有下面的麻烦事了,为了举例子,还请多多包含)。 
现在我们要按照下面两个条件对这个表进行查询 

1. 只选修一门课程的人,返回那门课程的ID 

2. 选修多门课程的人,返回所选的主课程ID 


简单的想法就是,执行两条不同的SQL语句进行查询。 
条件1 

--条件1:只选择了一门课程的学生

 

SELECT std_id, MAX(class_id) AS main_class

 

FROM Studentclass

 

GROUP BY std_id

 

HAVING COUNT(*) = 1;


执行结果1 

STD_ID   MAIN_class

------   ----------

300      4

400      5

500      6


条件2 

--条件2:选择多门课程的学生

 

SELECT std_id, class_id AS main_class

 

FROM Studentclass

 

WHERE main_class_flg = 'Y' ;

 


执行结果2 

STD_ID  MAIN_class

------  ----------

100     1

200     3


如果使用Case函数,我们只要一条SQL语句就可以解决问题,具体如下所示 

SELECT  std_id,

 

CASE WHEN COUNT(*) = 1  --只选择一门课程的学生的情况

 

THEN MAX(class_id)

 

ELSE MAX(CASE WHEN main_class_flg = 'Y'

 

THEN class_id

 

ELSE NULL END

)

 

END AS main_class

 

FROM Studentclass

 

GROUP BY std_id;


运行结果 

STD_ID   MAIN_class

------   ----------

100      1

200      3

300      4

400      5

500      6


通过在Case函数中嵌套Case函数,在合计函数中使用Case函数等方法,我们可以轻松的解决这个问题。使用Case函数给我们带来了更大的自由度。 
最后提醒一下使用Case函数的新手注意不要犯下面的错误 

CASE col_1

 

WHEN 1        THEN 'Right'

 

WHEN NULL  THEN 'Wrong'

 

END


在这个语句中When Null这一行总是返回unknown,所以永远不会出现Wrong的情况。因为这句可以替换成WHEN col_1 = NULL,这是一个错误的用法,这个时候我们应该选择用WHEN col_1 IS NULL。

CASE col_1

 

WHEN 1        THEN 'Right'

 

WHEN col_1 is NULL  THEN 'Wrong'

 

END

 

你可能感兴趣的:(sql)