mysql逻辑分组列和行_mysql逻辑分组行转列

表名(row_to_column)

表结构如下:

7edf95e42c78e80e632c51940ca255ba.png

SQL直接查询即可得如上结果:SELECT * from row_to_column

要达到查询效果如下结构:

cb9fa947acf2b8cb811dc9b0193730a2.png

正解SQL如下即可:

SELECT name as "姓名",

max(case subject when "数学" then score  end ) as "数学",

max(case subject when "语文" then score  end ) as "语文",

max(case subject when "英语" then score  end ) as "英语"

from row_to_column GROUP BY name

-----------------------------------------------------------------------------------------------------------------------------------------------------------

如果SQL直接写成如下,则会出现很多null

9a7cc104aeaa6a31547730e81b6eda2c.png

故进而可以根据姓名分组取每科最大的值,刚好每科最大的就是其真实分数,

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

如下SQL试错:

c0a9f9c01a74082ea33aa75ff8d55d98.png

(个人理解)根据name分组,则name相同的只应该显示一行,但是有可能name相同的存在有多行,MySQL就不知道该显示哪行了,就报错了。因为正解SQL里面使用了MAX聚合函数,可以做到name相同的只显示一行,就不会报错了

扩展:mysql官网对group by的解说:

https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html

如果使用了group by ,select的字段必须是group by的字段,否则查询在标准SQL-92中是非法的

主要是SQL模式启用了ONLY_FULL_GROUP_BY ,默认是启用的,临时关闭ONLY_FULL_GROUP_BY方法如下:

SELECT @@sql_mode;--先查询出来,然后把查询出来的字符串去掉ONLY_FULL_GROUP_BY再赋值回去

set @@GLOBAL.sql_mode='';

set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

此时就可以查询非group by的字段了

07e7d34d8586f1c31a668f5352d2d69a.png

如上图所示:关闭ONLY_FULL_GROUP_BY 模式后,根据name分组查询,name相同的存在多行,,查询结果只显示每个分组的第一行

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值