В 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
В качестве примера берём классику жанра, таблицу 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
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
Комментариев нет:
Отправить комментарий