提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
MYSQL行转列
数据库数据
预期结果
在写SQL语句前应该先去了解CASE的用法
一、CASE的用法
1.简单函数
case [ column_name ] when [ value ] then [ result ] else [ default ] end
2.搜索函数
case when [ expr ] then [ result ] else [ default ] end
举例说明
1.简单函数
行转列用到的是简单的case函数
代码如下(示例):
select name,
(case cname when '语文' then score end)语文,
(case cname when '数学' then score else 0 end)数学
from hzl;
执行结果
此时,已经基本上实现了行转列。到这一步时,我们应该使用Max,Sum函数来进行优化。
注意:在使用Max,Sum,Count等函数时,要与GROUP BY 搭配使用,否则会报错。SQL语句结尾要加上分号,否则也可能会报错。
Max函数
select name,
max(case cname when '语文' then score end)语文,
max(case cname when '数学' then score else 0 end)数学
from hzl
group by name;
结果
Sum函数
select name,
sum(case cname when '语文' then score end)语文,
sum(case cname when '数学' then score else 0 end)数学
from hzl
group by name;
结果
二、IF的用法
1.IF的语法
IF( expr1 , expr2 , expr3 )
expr1 的值为 TRUE,则返回值为 expr2
expr1 的值为FALSE,则返回值为 expr3
2.用法
select name,
if(cname = '语文',score,0)as '语文',
if(cname = '数学',score,0)as '数学'
from hzl;
结果
同样的,这里已经基本实现了行转列,我们同样要使用Sum,Max函数进行优化。
注意:与GROUP BY 搭配使用。
Max
select name,
max(if(cname = '语文',score,0))as '语文',
max(if(cname = '数学',score,0))as '数学'
from hzl
group by name;
结果
Sum
select name,
sum(if(cname = '语文',score,0))as '语文',
sum(if(cname = '数学',score,0))as '数学'
from hzl
group by name;
结果
总结
在进行行转列时,先使用CASE或者IF函数进行初步的实现,然后再配合SUM、MAX函数进行优化。配合SUM、MAX函数时应注意要与GROUP BY 一起使用。