oracle和hive如何实现行转列、列转行?
现在有oracle表student:三个字段name、subject、score,里面的数据是:
张三 语文 60
张三 数学 70
张三 英语 55
李四 语文 90
李四 英语 75
李四 物理 30
王五 语文 40
王五 英语 80
王五 物理 65
1. 用oracle SQL实现下面的统计结果?
name 语文 数学 英语 物理
张三 60 70 55 0
李四 90 0 75 30
王五 40 0 80 65
- 方案1
可以用oracle的pivot旋转函数处理:
select * from student pivot( sum(score) for subject in ("语文","数学","英语","物理"));
- 方案2
用聚合函数处理:
select
name,
--等同于max(case when subject="语文" then score else 0 end) as 语文,
max(if(subject="语文",score,0)) as 语文,
max(if(subject="数学",score,0)) as 数学,
max(if(subject="英语",score,0)) as 英语,
max(if(subject="物理",score,0)) as 物理
from student
group by name;
- 方案3
用union来连接:
(select
--等同于"张三",if("语文",score,0) as 语文,
"张三",case subject when "语文" then score else 0