最近面试问道了行转列,发现回答的可能不是那么完善,这边整理一下。
环境
group_concat()
select
student,
GROUP_CONCAT(CONCAT(course,':',result))
from result
GROUP BY student ;
!!! 一般不推荐这个写法, GROUP_CONCAT有个最大长度的限制,超过最大长度就会被截断掉,你可以通过下面的语句获得:
SELECT @@global.group_concat_max_len ;
show variables like "group_concat_max_len" ;
修改如下
- 在MySQL配置文件中my.conf或my.ini中添加: group_concat_max_len=102400
- 重启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 ;
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
总结
这边的操作方法都根据 group by分组 ,之后需要使用聚合函数对 结果集进行筛选, 如果没有 MAX() 函数 会出各种问题。 需要注意。