sql语句纵向转横向

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

数据库中的测试数据

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

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

sql语句1:

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

这个结果是不对的

sql语句2:

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

这个结果是对的

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

 

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

下面具体分析:

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

执行SQL为:

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

那么在不分组之前SQL为:

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

 

 

那么不分组数据为:

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

然后group by `姓名`;

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

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

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

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

 

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

第二个sql为:

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

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

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

得到结果为:

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

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

我们看看第二个SQL:

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

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

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

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

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

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值