mysql中的case when语句查询结果问题
数据库中的测试数据
现在我想让他显示的结果是 :姓名 语文 数学 物理 这种形式的(就是行转列)
sql语句1:
这个结果是不对的
sql语句2:
这个结果是对的
问题;为什么加上MAX就能显示正确的结果 ,case xx when 条件 then 结果 为什么第一条语文是正确的结果 其他的两个都不能正确显示呢?资料说 case when相当于switch那么我这应该有三条判断语句啊?不知道各位看懂我的描述没有 求教?
答:按照sql查询执行的顺序,先按名字分组,然后第一个语文符合条件,成绩就能正确出来,但是遇到数学时,第一个case,不是语文当然就取0了。而第二种写法,同样遇到数学时是0,但是会继续执行第二个case,这时是83,取两个最大的,当然就不是0了,然后继续执行第三个case,是0,去两个最大的,当然还是83了。其他同理!
下面具体分析:
你的写法第一种 不加max的时候
执行SQL为:
1 | SELECT `姓名`, CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END '语文' , |
2 | CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END '数学' , |
3 | CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END '物理' FROM TB GROUP BY `姓名`; |
那么在不分组之前SQL为:
1 | SELECT `姓名`, CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END '语文' , |
2 | CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END '数学' , |
3 | CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END '物理' FROM TB; |
那么不分组数据为:
然后group by `姓名`;
执行group by `姓名`时因为没有任何聚合函数, 那么会从基表里取group by后字段的第一条数据。即:
也就是你第一条SQL执行的结果:
OK。 我们再来说说第二个SQL。
第二个sql为:
1 | SELECT `姓名`, MAX ( CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END ) '语文' , |
2 | MAX ( CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END ) '数学' , |
3 | MAX ( CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END ) '物理' FROM TB GROUP BY `姓名`; |
先分解下SQL,执行MAX内CASE WHEN 及未GROUP BY `姓名`时SQL:
1 | SELECT `姓名`, CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END '语文' , |
2 | CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END '数学' , |
3 | CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END '物理' FROM TB; |
得到结果为:
这个结果其实和第一个SQL一样。
我们看看第二个SQL:
1 | SELECT `姓名`, MAX ( CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END ) '语文' , |
2 | MAX ( CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END ) '数学' , |
3 | MAX ( CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END ) '物理' FROM TB GROUP BY `姓名`; |
第二个SQL对分数进行了MAX函数操作同时又对`姓名`进行了分组。
那么这个基表max()中因为case when `课程` 取最大分数,再对`姓名`进行分组。
自然是取了每个姓名下每个学科的最高成绩。即: