今天,回顾了一下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 |