Oracle PIVOT
Desde la version 11 de Oracle es posible encolumnar los resultados totalizados de manera mas facil con la clausula PIVOT. En version 10 o anterior, era necesario realizar artificios con el decode o case when.
Veamos un ejemplo para explicar mejor. Tenemos una tabla con contiene las ventas realizadas en cada periodo por cada vendedor y deseamos presentar un resultado que muestre el resumen de las ventas presentando en la fila el vendedor y en las columnas los totales de ventas por mes.
Ejemplo
Datos insertados en la tabla ejemplo
SQL de la forma tradicional
Resultado
SQL clausula PIVOT
Resultado
Como se nota, tenemos el mismo resultado pero de manera mas facil, digamos que necesitamos incluir un total adicional que es numero de factura por vendedor, lo que hacemo es agregar la funcion agregada COUNT:
Resultado
Explicacion de contexto de la clausula PIVOT
Sintaxis
Parametros y argumentos
Funcion agregada: Se indica la funciones agregadas que se usaran SUM, COUNT, MIN, MAX o AVG
IN: Se especifican las expresiones que contiene column2 para presentar en columnas, en nuestro ejemplo eran los datos del campo PERIODO enlistados en 201701, 201702 y '201703.
Tambien es posible ubicar un subquery para listar las expresiones, pero solo es posible con PIVOT XML, el resultado arrojado sera un XML.
PIVOT XML
Desde la version 11 de Oracle es posible encolumnar los resultados totalizados de manera mas facil con la clausula PIVOT. En version 10 o anterior, era necesario realizar artificios con el decode o case when.
Veamos un ejemplo para explicar mejor. Tenemos una tabla con contiene las ventas realizadas en cada periodo por cada vendedor y deseamos presentar un resultado que muestre el resumen de las ventas presentando en la fila el vendedor y en las columnas los totales de ventas por mes.
Ejemplo
Definición de la tabla
ejemplo
|
CREATE TABLE VENTAS (
PERIODO VARCHAR2(6),
VENDEDOR VARCHAR2(20),
FACTURA NUMBER(5),
VALOR NUMBER);
|
Datos insertados en la tabla ejemplo
PERIODO | VENDEDOR | FACTURA | VALOR |
201701 | MANUEL | 3 | 4000 |
201701 | RAFAEL | 2 | 8000 |
201701 | VICTOR | 1 | 5000 |
201702 | MANUEL | 7 | 6000 |
201702 | RAFAEL | 4 | 3000 |
201702 | RAFAEL | 5 | 7000 |
201702 | VICTOR | 6 | 2000 |
201703 | MANUEL | 8 | 5000 |
201703 | MANUEL | 9 | 1000 |
201703 | RAFAEL | 10 | 4000 |
201703 | RAFAEL | 11 | 2000 |
SQL de la forma tradicional
SELECT VENDEDOR,
sum(DECODE(PERIODO,'201701',VALOR,0)) AS "201701",
sum(DECODE(PERIODO,'201702',VALOR,0)) AS "201702",
sum(DECODE(PERIODO,'201703',VALOR,0)) AS "201703"
FROM VENTAS GROUP BY VENDEDOR
|
Resultado
VENDEDOR | 201701 | 201702 | 201703 |
VICTOR | 5000 | 2000 | 0 |
MANUEL | 4000 | 6000 | 6000 |
RAFAEL | 8000 | 10000 | 6000 |
SQL clausula PIVOT
SELECT *
FROM (
SELECT VENDEDOR, PERIODO,VALOR
FROM VENTAS
)
PIVOT
(
SUM(VALOR)
FOR (PERIODO) IN ('201701','201702','201703')
)
|
Resultado
VENDEDOR | '201701' | '201702' | '201703' |
VICTOR | 5000 | 2000 | |
MANUEL | 4000 | 6000 | 6000 |
RAFAEL | 8000 | 10000 | 6000 |
Como se nota, tenemos el mismo resultado pero de manera mas facil, digamos que necesitamos incluir un total adicional que es numero de factura por vendedor, lo que hacemo es agregar la funcion agregada COUNT:
SELECT * FROM (
SELECT VENDEDOR, PERIODO,VALOR
FROM VENTAS
)
PIVOT
(
SUM(VALOR) MNT_FAC,--Suma
el monto de las facturas
COUNT(1) CNT_FAC --Cunta las
facturas
FOR (PERIODO) IN ('201701','201702','201703')
)
|
Resultado
VENDEDOR | 201701'_MNT_FAC | 201701'_CNT_FAC | 201702'_MNT_FAC | 201702'_CNT_FAC | 201703'_MNT_FAC | 201703'_CNT_FAC |
VICTOR | 5000 | 1 | 2000 | 1 | 0 | |
MANUEL | 4000 | 1 | 6000 | 1 | 6000 | 2 |
RAFAEL | 8000 | 1 | 10000 | 2 | 6000 | 2 |
Explicacion de contexto de la clausula PIVOT
Sintaxis
SELECT * FROM
(
--Los campos y
tablas que vamos a usar en la consulta, tanto los agupados como los totalizados
SELECT column1, , column2, column3
FROM tables
WHERE conditions
–Filtro de datos
)
PIVOT
(
Funcion agregada(column2)
–Funciones de agrgacion SUM, COUNT, AVG, MAX, MIN
FOR column1
IN ( expr1, expr2, ... expr_n) | subquery
)
ORDER BY expression [ ASC | DESC ];
|
Parametros y argumentos
Funcion agregada: Se indica la funciones agregadas que se usaran SUM, COUNT, MIN, MAX o AVG
IN: Se especifican las expresiones que contiene column2 para presentar en columnas, en nuestro ejemplo eran los datos del campo PERIODO enlistados en 201701, 201702 y '201703.
Tambien es posible ubicar un subquery para listar las expresiones, pero solo es posible con PIVOT XML, el resultado arrojado sera un XML.
PIVOT XML
SELECT * FROM (
SELECT VENDEDOR, PERIODO,VALOR
FROM VENTAS
)
PIVOT XML
(
SUM(VALOR) MNT_FAC
FOR (PERIODO) IN (SELECT TO_CHAR(ADD_MONTHS(SYSDATE,(LEVEL-1)*-1),'yyyymm')PERIODO FROM DUAL CONNECT BY LEVEL <=7)
)
|
No hay comentarios:
Publicar un comentario