一、行列转换
纵表转横表
1.先根据姓名进行分组
select username from stu group by username
2.decode函数
case 字段名
when 值1 then 结果1
when 值2 then 结果2
···
else 结果n
end
实例
转换前
username | course | score |
---|---|---|
张三 | mysql | 90 |
张三 | hive | 85 |
张三 | python | 79 |
李四 | mysql | 86 |
李四 | hive | 89 |
李四 | python | 92 |
方案1
#查询
select username,
sum(case course when 'mysql' then score else 0 end ) mysql,
sum(case course when 'hive' then score else 0 end ) hive,
sum(case course when 'python' then score else 0 end ) python
from stu group by username;
#查询,并将查询结果保存成view视图
create view vstu as select username,
sum(case course when 'mysql' then score else 0 end ) mysql,
sum(case course when 'hive' then score else 0 end ) hive,
sum(case course when 'python' then score else 0 end ) python
from stu group by username;
#查询视图内容
select * from vstu;
转换后
username | mysql | hive | python |
---|---|---|---|
张三 | 90 | 85 | 79 |
李四 | 86 | 89 | 92 |
方案2
select username,group_concat(course),group_concat(score)
from stu group by username;
转换后
username | group_concat(course) | group_concat(course) |
---|---|---|
张三 | mysql,hive,python | 90,85,79 |
李四 | mysql,hive,python | 86,89,92 |
横表转纵表
实例
转换前
username | mysql | hive | python |
---|---|---|---|
张三 | 90 | 85 | 79 |
李四 | 86 | 89 | 92 |
select username ,'mysql' course , mysql score from vstu
union all
select username ,'hive' course , hive score from vstu
union all
select username ,'python' course , python score from vstu;
转换后
username | course | score |
---|---|---|
张三 | mysql | 90 |
张三 | hive | 85 |
张三 | python | 79 |
李四 | mysql | 86 |
李四 | hive | 89 |
李四 | python | 92 |