mysql行列转置
环境准备:mysql,navicat
本文讲解列转行:
数据库是这样显示的
想要转换成下面这样显示
开始列转行之前的准备
准备1:创建表学生分数表grade
create table grade ( stuname varchar(20) not null comment '学生姓名', stucourse varchar(20) not null comment '学生课程名', stuscore int not null comment '学生课程分数' )
grade表创建好了,也可以直接navicat数据库右键鼠标建表
鼠标右键单击grade设计表查看表结构设置,结果与sql语句设置一致继续往下走
准备2:往分数表grade插入多条数据
insert into grade(stuname,stucourse,stuscore) values ('张三','语文',110), ('张三','数学',130), ('张三','英语',60), ('张三','体育',40), ('李四','语文',108), ('李四','数学',145), ('李四','英语',28), ('李四','体育',48), ('王五','语文',120), ('王五','数学',99), ('王五','英语',140), ('王五','体育',42)
鼠标双击grade查看数据是否已插入,ok
下面开始步入正题
步骤一:查询表内所有数据(注释:'*'代表所有)
select * from grade
查询结果显然不符合我们的预期
步骤二修改查询的sql语句
- 方式一:case
case case_value when when_value then statement_list else statement_list end case;
具体代码
select stuname, sum(case when stucourse='语文' then stuscore else 0 end) as '语文', sum(case when stucourse='数学' then stuscore else 0 end) as '数学', sum(case when stucourse='英语' then stuscore else 0 end) as '英语', sum(case when stucourse='体育' then stuscore else 0 end) as '体育', sum(stuscore) as '学科总分' from grade group by stuname
以下为代码注释:
//select 后跟查询结果 select stuname, //sum 聚合函数(官方写好求和用的) // case when stucourse='语文' then stuscore else 0 end 用于替换值 若stucourse='语文' 则对应显示stuscore,否则显示0 //as 重命名 列/(也叫字段)名 sum(case when stucourse='语文' then stuscore else 0 end) as '语文', sum(case when stucourse='数学' then stuscore else 0 end) as '数学', sum(case when stucourse='英语' then stuscore else 0 end) as '英语', sum(case when stucourse='体育' then stuscore else 0 end) as '体育', //sum(stuscore)求各个学科总分数 sum(stuscore) as '学科总分' //from 后跟要查询的表名 from grade //group by 对stuname进行分组,没有这句,会报错,要不然,就是显示第一行 group by stuname
查询结果,符合预期,列转行成功
- 方式二:if
if(expr1,expr2,expr3)
具体代码
select stuname, sum(if(stucourse='语文',stuscore,0)) as '语文', sum(if(stucourse='数学',stuscore,0)) as '数学', sum(if(stucourse='英语',stuscore,0)) as '英语', sum(if(stucourse='体育',stuscore,0)) as '体育', sum(stuscore) as '学科总分' from grade group by stuname
效果和方式一是一样的
小节:
1.这里面的sum可以换成max,min,avg等等,因为各个字段如stucourse对应一个stuscore所以用哪个都一样
2.当普通字段如stuname与聚合函数sum(stuscore)一起查询时 stuname,sum(字段)
必须要分组,group by stuname
不然会报错!!!
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论