请选择 进入手机版 | 继续访问电脑版

悍铭论坛

 找回密码
 立即注册
查看: 467|回复: 0

SQL中Case的使用方法(四)

[复制链接]

54

主题

255

帖子

422

积分

县令

Rank: 3Rank: 3

积分
422
发表于 2016-6-25 18:08:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

六,在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的话,就没有下面的麻烦事了,为了举例子,还请多多包含)。

现在我们要按照下面两个条件对这个表进行查询

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

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



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

条件



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

SELECT std_id, MAX(class_id) AS main_class

FROM Studentclass

GROUP BY std_id

HAVING COUNT(*) = 1;



执行结果



STD_ID   MAIN_class

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

300      4

400      5

500      6



条件



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

SELECT std_id, class_id AS main_class

FROM Studentclass

WHERE main_class_flg = 'Y' ;



执行结果



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。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|悍铭论坛 ( 滇ICP备13006366号-1 )

GMT+8, 2018-11-13 01:58 , Processed in 0.059440 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表