MYSQL中竖表和横表之间的相互转换

横表转为竖表

表tb的结构为

字段名 类型 允许为空 是否主键
id int(11) no yes
姓名 int(11) yes no
语文 decimal(3,1) yes no
数学 decimal(3,1) yes no
英语 decimal(3,1) yes no

表中的数据为

id 姓名 语文 数学 英语
1 小张 89 80 89
2 小丽 69 78 98

现在要求查询到如下结果

name subject score
小丽 语文 69
小丽 数学 78
小丽 英语 79
小张 语文 89
小张 数学 80
小张 英语 89

使用的SQL查询语句应该如下:

1
2
3
4
      select 姓名 as name, '语文' as subject, 语文 as score from tb
union select 姓名 as name, '数学' as subject, 数学 as score from tb
union select 姓名 as name, '英语' as subject, 英语 as score from tb
order by name

或者

1
2
3
4
5
6
7
8
select * from(
select 姓名 as name, '语文' as subject `语文` as score from tb
union
select 姓名 as name, '数学' as subject `数学` as score from tb
union
select 姓名 as name, '英语' as subject `英语` as score from tb
) as tb2
order by name

竖表转为横表

tb2表的结构如下

字段名 类型 允许为空 是否主键
id int(11) no yes
name varchar(255) yes no
subject varchar(255) yes no
score decimal(3,1) yes no

tb2的数据如下

id name subject score
2 小丽 英语 98
3 小丽 数学 78
6 小张 语文 89
5 小张 数学 80
4 小张 英语 89
1 小丽 语文 69

现在想把tb2的数据变为

姓名 语文 英语 数学
小丽 68 98 78
小张 89 89 80

查询的SQL语句如下:

1
2
3
4
5
6
select name as '姓名',
max(case subject when '语文' then score else 0 end) 语文,
max(case subject when '英语' then score else 0 end) 英语,
max(case subject when '数学' then score else 0 end) 数学
from tb2
group by name

现在要求得到如下查询结果

姓名 语文 数学 英语 总分 平均分
小丽 69 78 98 245 81.6666667
小张 89 80 89 258 86

SQL查询语句应该为:

1
2
3
4
5
6
7
8
select `name` as 姓名,
max(case `subject` when '语文' then `score` else 0 end) as 语文,
max(case `subject` when '数学' then `score` else 0 end) as 数学,
max(case `subject` when '英语' then `score` else 0 end) as 英语,
sum(`score`) as 总分,
sum(`score`) as 平均分
from `tb2`
group by `name`
关注作者公众号,获取更多资源!
赏作者一杯咖啡~