对于Oracle的行转列功能一直云里雾里,马马虎虎,对行转列的使用场景和使用方法都不够深刻,最近有空理解一下。
Oracle 11g后有专门的函数pivot,对于特定的场景可以直接套用。
需求:求各份job不同员工工资是多少?
job | sal | deptno |
---|---|---|
A | 1000 | 10 |
A | 1000 | 20 |
A | 2000 | 20 |
B | 3000 | 20 |
B | 4000 | 30 |
C | 5000 | 20 |
C | 6000 | 30 |
select ①* from
(select ②job,sal,deptno)
pivot (sum(sal) as ③s
for deptno in (10 as d10,20 as d20,30 as d30))
order by 1;
执行结果如下:
job | d10_s | d20_s | d30_s |
---|---|---|---|
A | 1000 | 3000 | |
B | 3000 | 4000 | |
C | 5000 | 6000 |
注释:
① 该处返回的是行转列之后的字段,如果查询原有字段会报错;
② 除了要汇总的列sal和要转换的列deptno,其他字段默认group by;
③ as后加的s与d10、d20、d30默认下划线连接,也可不做另外连接;
④ pivot子句实际执行的还是case when语句。