SQL进阶教程第一章----CASE表达式之在CASE表达式中使用聚合函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQL进阶教程第⼀章----CASE表达式之在CASE表达式中使⽤聚
合函数
接下来我们学习⼀套新的掌法,实例:假设这⾥有⼀张显⽰了学⽣及其加⼊的摄⼊安的⼀览表,StudentClub,表的主键是“学⽣、社团ID”,存储了学⽣和社团之间的多对多的关系。
有的学会加⼊了多个社团,有的只是加⼊了某个社团,对于加⼊了多个社团的学⽣,我们通过将其“主社团标志”列设置为Y或者N来表明哪个社团是他的主社团,对于只是加⼊了⼀个社团的学⽣,我们将其“主社团标志”列设置为N。
现在需求如下:
1.如果学⽣只是加⼊了⼀个社团,则显⽰该学⽣id和社团id
2.如果学⽣加⼊了多个社团,则显⽰该学⽣id和主社团id
将两个结果结合到⼀张表⾥⾯:
对此,第⼀种错误⽅式:
使⽤了UNION进⾏连接,但是不知道为什么使⽤UNION之后,记录少了⼀条,可能是对UINION的使⽤还不够透彻,等UION学习之后再来分析此问题
SELECT std_id, MAX(club_id) AS main_club
FROM StudentClub
GROUP BY std_id
HAVING COUNT(*) =1;
UNION
SELECT std_id, club_id AS main_club
FROM studentclub
WHERE main_club_flg = true;
第⼆种错误⽅式,我在CASE表达式中使⽤了聚合函数,但是仍然有错-:
SELECT std_id, CASE WHEN COUNT(*) =1THEN club_id
WHEN COUNT(*) >1THEN CASE WHEN main_club_flg = true THEN club_id
ELSE NULL END
ELSE NULL END AS main_club
FROM StudentClub
GROUP BY std_id
来看下标准答案:
SELECT std_id, CASE WHEN COUNT(*) =1THEN MAX(club_id)
ELSE MAX(CASE WHEN main_club_flg = true THEN club_id
ELSE NULL END) END AS main_club
FROM StudentClub
GROUP BY std_id
可以看到第⼆个错误⽅式和标准答案之间的差别在于对最外层的CASE表达式的分条件处理,分析下第⼆种错误⽅式的蕴含式:
count(*) >1为P , main_club_flg = true为Q,P为真的时候,Q为真,返回club_id;
P为真 Q不确定发的时候,返回null;
啊啊啊啊,还是不清楚为什么会返回错误。
!!!!
这条SQL语句在CASE表达式⾥⾯使⽤了聚合函数,⼜在聚合函数⾥⾯使⽤了CASE表达式。
其主要⽬的是⽤CASE WHEN COUNT(*) =1.......ELSE.......来表⽰“只加⼊了⼀个社团还是加⼊了多个社团”。
我们⼀般对聚合结果进⾏条件判断时要⽤HAVING⼦句,但是在这个例⼦中可以看到,在SELECT语句⾥⾯使⽤CASE表达式也可以完成同样的⼯作。
对应于之前的,新⼿⽤WHERE⼦句进⾏分⽀,⾼⼿⽤SELECT⼦句进⾏条件分⽀。
我们这条的技巧可以总结为:新⼿⽤HAVING⼦句进⾏条件分⽀,⾼⼿⽤SELECT⼦句进⾏条件分⽀。
CASE表达式⽤在SELECT⼦句中时,既可以写在聚合函数内部,也可以写在聚合函数外部。