mysql逻辑分组行转列

表名(row_to_column)

表结构如下:

mysql逻辑分组行转列_第1张图片

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

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

 

mysql逻辑分组行转列_第2张图片

正解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

mysql逻辑分组行转列_第3张图片

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

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

如下SQL试错:

mysql逻辑分组行转列_第4张图片

(个人理解)根据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的字段了

mysql逻辑分组行转列_第5张图片

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

 

 

你可能感兴趣的:(数据库,mysql)