现有一数据库表,如图:
表结构说明:stu_id为学生id,class_id为课程id,class_name为课程名称,main_class_flag表示是否为主修课程,Y表示是,N表示否!!
现在根据需求查询:只选修一门课程的人,返回那门课程的ID和选修多门课程的人,返回所选的主课程ID。
现我通过查询语句:
select stu_id,case when count(*) = 1 then class_id
else (case when main_class_flag = 'Y' then class_id else NULL END) END as classid
from courses group by stu_id;
得到如下结果:
但是如果再第二个case when前加上max,即:
select stu_id,case when count(*) = 1 then class_id
else max(case when main_class_flag = 'Y' then class_id else NULL END) END as classid
from courses group by stu_id;
就会得出完整结果,如下:
问题:
请问各位大佬,这是什么原因,为什么必须要加上这个max()结果才会完整,请帮我解解惑。。。
我大致看了下 你应该是没看出来你自己写进去了2个历史学么 既然是两个历史学 后面跟group by 根据stu_id
分类 那么 怎么分 2个两百 系统识别不出来 加了max 也是筛选出最大的那个 class id 从语法上你每错 但是逻辑是错的
还有大兄弟 任何一个数据库表 最好创建一个主键 你这个我感觉是sql server把 自己要养成习惯创建一个主键
经过几番琢磨,我发现了我所遇到的问题根本之所在。
首先,标题及提问方面,对于这个max的误导我先说声不好意思。其实跟这个max没太大关系。
再说说问题,至于这个为什么加上max能显示第二条数据的classid,不加则不会显示,其实这跟数据的排序顺序有点一点关系。就是如果我们把表中的stu_id为200的第一条数据历史学改成主修课Y,那么这个查询的结果集也不会出现null值。当然,这不是关键。
关键是语句逻辑问题。这个查询语句因为本身就是查询了两个条件的结果集,那么我们得分开来看这个问题。
第一点:第一句case when 这是查询只选修了一门课程的同学,即stu_id为300,400,500的同学,对应的class_id为4,5,6;
第二点:else后面接的则是选修了多门课程的数据,也是按stu_id分组查出来的。那么此时在这个多门课程的分组中再使用case when else时,他显示出来的第一条结果肯定是满足条件的第一条数据,至于为什么第二条的200后面为null是因为第二个case when 语句后面的else条件为null,如果你改成其他的,则会显示别的。那么用聚合函数来包含这个结果集时,有结果的数据应该是优先于为null值的查询结果的。所以我们加上聚合函数,会得到我们想要的结果。