Функция Oracle Pivot
Как развернуть столбец в строку?
Для этого в Oracle SQL начиная с версии 11g есть специальная функция pivot.
Пример.
Для этого в Oracle SQL начиная с версии 11g есть специальная функция pivot.
Пример.
--Создаем тестовую таблицу и наполняем ее данными
create table tDateValue
(
dateV varchar2(50),
value number
);
insert into tDateValue(dateV,value) values('2013.08',80);
insert into tDateValue(dateV,value) values('2013.08',1);
insert into tDateValue(dateV,value) values('2013.08',2);
insert into tDateValue(dateV,value) values('2013.09',90);
insert into tDateValue(dateV,value) values('2013.09',1);
insert into tDateValue(dateV,value) values('2013.09',2);
insert into tDateValue(dateV,value) values('2013.10',100);
insert into tDateValue(dateV,value) values('2013.10',1);
insert into tDateValue(dateV,value) values('2013.10',2);
insert into tDateValue(dateV,value) values('2013.10',3);
insert into tDateValue(dateV,value) values('2013.11',110);
insert into tDateValue(dateV,value) values('2013.11',1);
insert into tDateValue(dateV,value) values('2013.11',2);
insert into tDateValue(dateV,value) values('2013.12',120);
insert into tDateValue(dateV,value) values('2013.12',1);
insert into tDateValue(dateV,value) values('2013.12',2);
commit;
--допустим, требуется сгруппировать данные по датам
select tDV.Datev, sum(tDV.Value) as summa
from tDateValue tDV
group by tDV.Datev
--получим следущее:
DATEV summa
2013.09 93
2013.11 113
2013.08 83
2013.10 106
2013.12 123
--однако, получившийся результат не очень наглядный,
и хочется развернуть столбец в строку.
select * from
(
select tDV.Datev, tDV.Value
from tDateValue tDV
)
pivot
(
sum(Value)
for Datev in ('2013.08' as "2013.08",'2013.09' as "2013.09",
'2013.10' as "2013.10",'2013.11' as "2013.11",
'2013.12' as "2013.12")
)
-- получится так:
2013.08 2013.09 2013.10 2013.11 2013.12
83 93 106 113 123
Для функции pivot есть обратная функция unpivot, она наоборот развернет строку в столбец.
ещё один пример
ещё один пример
SELECT *
FROM (SELECT job, deptno, sum(sal) sal FROM emp GROUP BY job, deptno)
PIVOT ( sum(sal) FOR deptno IN (10, 20, 30, 40) );
JOB 10 20 30 40
--------- ---------- ---------- ---------- ----------
CLERK 1300 1900 950
SALESMAN 5600
PRESIDENT 5000
MANAGER 2450 2975 2850
ANALYST 6000
Немає коментарів:
Дописати коментар