WWM0104的gravatar头像
WWM0104 2014-10-23 10:41:22

mysql中的case when语句查询结果问题

数据库中的测试数据

mysql中的case when语句查询结果问题

现在我想让他显示的结果是 :姓名 语文 数学 物理 这种形式的(就是行转列)

sql语句1:

mysql中的case when语句查询结果问题

这个结果是不对的

sql语句2:

mysql中的case when语句查询结果问题

这个结果是对的

问题;为什么加上MAX就能显示正确的结果 ,case xx when 条件 then 结果   为什么第一条语文是正确的结果 其他的两个都不能正确显示呢?资料说 case when相当于switch那么我这应该有三条判断语句啊?不知道各位看懂我的描述没有 求教?


最代码官方编辑于2014-10-23 14:48:09
所有回答列表(5)
遇见,的gravatar头像
遇见,  LV36 2014年10月24日

很简单  你的写法第一种  不加max的时候

执行SQL为:

SELECT `姓名`, CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END '语文',
		CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END '数学',
		CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END '物理' FROM TB GROUP BY `姓名`;

那么在不分组之前SQL为:

SELECT `姓名`, CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END '语文',
		CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END '数学',
		CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END '物理' FROM TB;

那么不分组数据为:

mysql中的case when语句查询结果问题

然后group by `姓名`;

执行group by `姓名`时因为没有任何聚合函数, 那么会从基表里取group by后字段的第一条数据。即:

mysql中的case when语句查询结果问题

也就是你第一条SQL执行的结果:

mysql中的case when语句查询结果问题

 

OK。  我们再来说说第二个SQL。

第二个sql为:

SELECT `姓名`, MAX(CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END) '语文',
		MAX(CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END) '数学',
		MAX(CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END) '物理' FROM TB GROUP BY `姓名`;

先分解下SQL,执行MAX内CASE WHEN 及未GROUP BY `姓名`时SQL:

SELECT `姓名`, CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END '语文',
		CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END '数学',
		CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END '物理' FROM TB;

得到结果为:

mysql中的case when语句查询结果问题

这个结果其实和第一个SQL一样。

我们看看第二个SQL:

SELECT `姓名`, MAX(CASE `课程` WHEN '语文' THEN `分数` ELSE 0 END) '语文',
		MAX(CASE `课程` WHEN '数学' THEN `分数` ELSE 0 END) '数学',
		MAX(CASE `课程` WHEN '物理' THEN `分数` ELSE 0 END) '物理' FROM TB GROUP BY `姓名`;

第二个SQL对分数进行了MAX函数操作同时又对`姓名`进行了分组。

那么这个基表max()中因为case when `课程` 取最大分数,再对`姓名`进行分组。

自然是取了每个姓名下每个学科的最高成绩。即:

mysql中的case when语句查询结果问题

评论(4) 最佳答案
kiky的gravatar头像
kiky  LV10 2014年10月23日

我先抢个沙发!

antonio689的gravatar头像
antonio689 2014年10月23日

你想想你那么写的逻辑嘛, 如果按照你第一种写法,
按照sql查询执行的顺序,先按名字分组,然后第一个语文符合条件,成绩就能正确出来,但是遇到数学时,第一个case,不是语文当然就取0了。而第二种写法,同样遇到数学时是0,但是会继续执行第二个case,这时是83,取两个最大的,当然就不是0了,然后继续执行第三个case,是0,去两个最大的,当然还是83了。其他同理!

qq792005991的gravatar头像
qq792005991  LV3 2014年10月23日

当你把 按照姓名分组去掉时 是这样的

mysql中的case when语句查询结果问题

 

后面  group by 姓名 以后 聚合 比如下面这个

mysql中的case when语句查询结果问题

 

如果没有 MAX 其实 取得 只有数学成绩 后面 两列是 0的哪一行

Edson188的gravatar头像
Edson188  LV22 2014年10月27日

说白了是就是纵向转横向的问题和case when没太大关系,和分组聚合函数有关系

不用case when then max group by 还不是可以做成你这效果。

不过要写在后台代码里,先取数据,在变为你所需要的数据放入临时表,在查询临时表。

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友