Funciones Oracle: pivot / unpivot
PIVOT, permite trasponer filas a columnas y UNPIVOT, permite el paso inverso, el paso de columnas a filas. Están disponibles a partir de la versión Oracle 11G.
La mismo que se realiza mediante PIVOT y UNPIVOT, se podía realizar en versiones anteriores, mediante funciones de decodificación, pero son menos eficiente y si había muchos valores podría ser bastante engorroso.
EJEMPLO PIVOT:
Creamos la tabla de partida.
CREATE TABLE TABLA (CAMPO1 NUMBER, CAMPO2 NUMBER, CAMPO3 VARCHAR2(10), CAMPO4 VARCHAR2(10)); INSERT INTO TABLA (CAMPO1, CAMPO2, CAMPO3, CAMPO4) VALUES (1,1,'valor1', 'contenido'); INSERT INTO TABLA (CAMPO1, CAMPO2, CAMPO3, CAMPO4) VALUES (2,1,'valor1', 'contenido'); INSERT INTO TABLA (CAMPO1, CAMPO2, CAMPO3, CAMPO4) VALUES (3,2,'valor1', 'contenido'); INSERT INTO TABLA (CAMPO1, CAMPO2, CAMPO3, CAMPO4) VALUES (4,2,'valor2', 'contenido'); INSERT INTO TABLA (CAMPO1, CAMPO2, CAMPO3, CAMPO4) VALUES (1,1,'valor1', 'contenido'); INSERT INTO TABLA (CAMPO1, CAMPO2, CAMPO3, CAMPO4) VALUES (2,1,'valor1', 'contenido'); INSERT INTO TABLA (CAMPO1, CAMPO2, CAMPO3, CAMPO4) VALUES (3,2,'valor1', 'contenido'); INSERT INTO TABLA (CAMPO1, CAMPO2, CAMPO3, CAMPO4) VALUES (4,3,'valor2', 'contenido2'); commit;
Creamos la tabla pivotada:
create table TABLA_P nologging as SELECT * FROM TABLA PIVOT (max(campo2) -- Campo agrupado pivotado FOR campo3 -- Campo cuyo contenido pasan a ser columnas IN ('valor1' as valor1, 'valor2' as valor2) -- Nuevas columnas ) ORDER BY campo1, campo4;
SELECT * FROM TABLA_P; CAMPO1 CAMPO4 VALOR1 VALOR2 ---------- ---------- ---------- ---------- 1 contenido 1 2 contenido 1 3 contenido 2 4 contenido 2 4 contenido2 3
Para versiones previas a la 11G se haría de la siguiente manera:
SELECT campo1, campo4, MAX(DECODE(campo3, 'valor1', campo2, null)) VALOR1, MAX(DECODE(campo3, 'valor2', campo2, null)) VALOR2 FROM TABLA GROUP BY campo1, campo4 ORDER BY campo1, campo4; CAMPO1 CAMPO4 VALOR1 VALOR2 ---------- ---------- ---------- ---------- 1 contenido 1 2 contenido 1 3 contenido 2 4 contenido 2 4 contenido2 3
EJEMPLO UNPIVOT:
Ahora haremos el paso inverso, paso de columnas a filas:
create table TABLA_U nologging as SELECT * FROM TABLA_P UNPIVOT (campo6 -- Nuevo campo donde se reflejará el conteo de registros con el mismo campo1 y campo 2 FOR campo5 -- Campo en el que se fusionan los campos VALOR1 y VALOR2 IN (valor1, valor2));
SELECT * FROM TABLA_U; CAMPO1 CAMPO4 CAMPO5 CAMPO6 ---------- ---------- ------ ---------- 1 contenido VALOR1 1 2 contenido VALOR1 1 3 contenido VALOR1 2 4 contenido VALOR2 2 4 contenido2 VALOR2 3
Para versiones previas a la 11G se haría de la siguiente manera:
SELECT CAMPO1, CAMPO4, 'VALOR1' CAMPO5, valor1 campo6 FROM TABLA_P WHERE VALOR1 is not null UNION SELECT CAMPO1, CAMPO4, 'VALOR2' CAMPO5, valor2 campo6 FROM TABLA_P WHERE VALOR2 is not null; CAMPO1 CAMPO4 CAMPO5 CAMPO6 ---------- ---------- ------ ---------- 1 contenido VALOR1 1 2 contenido VALOR1 1 3 contenido VALOR1 2 4 contenido VALOR2 2 4 contenido2 VALOR2 3
Comments are closed.