今天,回顾了一下sql的纵表和横表的转换 写一下

给出表1和表2要求出里面数据的平均值

表1:

 sid

name

chain

math

english

0001

张三

96

86

76

表2:

name

subject

score

张三

chain

96

张三

math 

86

张三

english

76

 

现把转换方式列举如下:

1、横表转纵表

我的横表的样子是如下

sid

name

chain

math

english

0001

张三

96

86

76

转为纵表的sql语句为

SELECT s.`name`,AVG(score) FROM (
SELECT name,CHAIN score FROM student
UNION
SELECT name,math score FROM student
UNION
SELECT name,english score FROM student
)s GROUP BY s.`name`;

这样就可以出来name为张三的三门成绩的平均值

sql出来的效果为:

name

AVG(score)

张三

97.000

 

 

2、纵表转横表

我的表格为下图

 name

subject

score

张三

chain

96

张三

math 

86

张三

english

76

转为横表的sql为:

SELECT s.`name`,
SUM(case subject WHEN 'chain' THEN score ELSE 0 end)as 语文,
SUM(case subject WHEN 'math' THEN score ELSE 0 end)as 数学,
SUM(case subject WHEN 'english' THEN score ELSE 0 end)as 英语
FROM stuk s
GROUP BY s.`name`

这样转换的表的效果为

name

语文

数学

英语

张三

96

86

76