Функция Oracle SQL Pivot. Разворот столбцов

Статьи про Oracle -> Программирование

Функция Oracle SQL Pivot. Разворот столбцов

v:1.0 03.08.2014
Петрелевич Сергей

При подготовке данных для отчетов иногда надо развернуть столбец в строку.
Для этого в 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, она наоборот развернет строку в столбец.

Метки: SQL  

Комментарии.

Внимание.
Комментировать могут только зарегистрированные пользователи.
Возможно использование следующих HTML тегов: <a>, <b>, <i>, <br>.