четверг, 19 мая 2011 г.

PIVOT и UNPIVOT в Oracle 11g

   В Oracle 11g появились новые функции, которые позволяют разворачивать таблицу. Здесь я приведу пример для быстрого понимания того, как это работает, в конце статьи дам ссылку на чуть более подробное объяснение того как это работает.


PIVOT берёт данные из строк, аггрегирует их и возвращает в виде столбцов, иначе говоря, строит сводную таблицу.
   В качестве примера берём классику жанра, таблицу emp из схемы scott
   Сделаем разворот этой таблицы, чтобы получить сумму зарплат разбитую по должностям и департаментам:
   Строим таблицу суммы заплат по должностям и департаментам, которую потмо будем разворачивать
SELECT job, deptno, sum(sal) sal FROM emp GROUP BY job, deptno

JOB DEPTNO SAL
--------- ---------- ----------
MANAGER 20 2975
PRESIDENT 10   5000
CLERK 10   1300
SALESMAN 30 5600
ANALYST 20 6000
MANAGER 30 2850
MANAGER 10 2450
CLERK 30 950
CLERK 20 1900

Внешний запрос строит сводную таблицу по должностям и департаментам, внутри функции PIVOT, надо указать аггрегирующую функцию, и значения столбцов, по которым надо будет группировать данные
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

   UNPIVOT преобразует данные, разбитые по колонкам в данные разбитые по строкам.
Вот пример её работы:
with t as (
select 'Oracle EE' as product, 100 as Q1, 123 as Q2, 130 as Q3, 128 as Q4 from dual
union all
select 'Partitioning', 100, 123, 130, 128 from dual
)

SELECT * FROM t
UNPIVOT INCLUDE NULLS (quantity_sold FOR quarter IN (Q1, Q2, Q3, Q4));

PRODUCT                        QUARTER QUANTITY_SOLD
------------------------------ ------- -------------
Oracle EE                      Q1           100
Oracle EE                      Q2           123
Oracle EE                      Q3           130
Oracle EE                      Q4           128
Partitioning                   Q1           100
Partitioning                   Q2           123
Partitioning                   Q3           130
Partitioning                   Q4           128


   Для работы функции UNPIVOT требуется указать имена колонок, которые будут заполнена значениями из строк в нашем случае это quantity_sold и quarter, колоки, которые будут развёрнуты в строки указываются после IN это: Q1, Q2, Q3, Q4
   Больше информации по этим функциям можно прочитать: http://www.oracle-base.com/articles/11g/PivotAndUnpivotOperators_11gR1.php и http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_10002.htm#CHDFAFIE

Комментариев нет:

Отправить комментарий