mysql 行转列

330 阅读1分钟

最近面试问道了行转列,发现回答的可能不是那么完善,这边整理一下。

环境

image.png

image.png

group_concat()

select 
    student,
    GROUP_CONCAT(CONCAT(course,':',result)) 
from result 
GROUP BY student ;

image.png

!!! 一般不推荐这个写法, GROUP_CONCAT有个最大长度的限制,超过最大长度就会被截断掉,你可以通过下面的语句获得:

SELECT @@global.group_concat_max_len ;
show variables like "group_concat_max_len" ;

修改如下

  1. 在MySQL配置文件中my.conf或my.ini中添加: group_concat_max_len=102400
  2. 重启MySQL服务

MAX(IF())

select 
    student
    ,MAX(IF(course='java',result,0)) as java 
    ,MAX(IF(course='mysql',result,0)) as mysql  
from result 
    GROUP BY student ;

image.png

MAX(CASE)

select 
    student ,
    MAX(CASE course
            WHEN 'java' THEN
                    result
            end
    ) as java,
    MAX(CASE course
            WHEN 'mysql' THEN
                    result
            end
    ) as mysql 
FROM result 
    GROUP BY student 

image.png

总结

这边的操作方法都根据 group by分组 ,之后需要使用聚合函数对 结果集进行筛选, 如果没有 MAX() 函数 会出各种问题。 需要注意。