вівторок, 14 квітня 2015 р.

Функция Oracle "Pivot"


Функция Oracle 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



Немає коментарів:

Дописати коментар