La versión 11g de la base de datos Oracle incorpora la cláusula PIVOT que resuelve, en parte, un problema que alguna vez se me presentó y que tuve que resolver con una consulta poco intuitiva y limitada.
![]()
Paso a explicar el tema en detalle con el siguiente ejemplo:
Supongamos una tabla donde se guarde el total de las ventas mensuales por distintas compañías:
CREATE TABLE test (
company varchar(12),
monthy char(7),
sales number
);
INSERT INTO test VALUES ('CMP1','2008-06', 10);
INSERT INTO test VALUES ('CMP1','2008-07', 29);
INSERT INTO test VALUES ('CMP1','2008-08', 39);
INSERT INTO test VALUES ('CMP1','2008-09', 41);
INSERT INTO test VALUES ('CMP1','2008-10', 22);
INSERT INTO test VALUES ('CMP2','2008-06', 13);
INSERT INTO test VALUES ('CMP2','2008-07', 17);
INSERT INTO test VALUES ('CMP2','2008-08', 61);
INSERT INTO test VALUES ('CMP2','2008-09', 55);
INSERT INTO test VALUES ('CMP2','2008-10', 71);
INSERT INTO test VALUES ('CMP3','2008-06', 33);
INSERT INTO test VALUES ('CMP3','2008-07', 18);
INSERT INTO test VALUES ('CMP3','2008-08', 27);
INSERT INTO test VALUES ('CMP3','2008-09', 5);
INSERT INTO test VALUES ('CMP3','2008-10', 32);
Para obtener lo totales de ventas por compañía, podemos escribir algo así:
Si nuestra intención es disponer estos datos de forma traspuesta, y obtener un listado donde:
podemos escribir algo así:
Donde obtendríamos:
Si bien, la consulta anterior funciona, no es muy intuitiva. Con la cláusula PIVOT podemos escribir la misma consulta de manera más sencilla y entendible:
Esto es solo un comienzo, dejo a vuestra imaginación y uso todas las combinaciones posibles que podemos escribir con esta cláusula.
Vía: Programación PL/SQL
3 Respuestas para "Trasponer tabla en Oracle con cláusula PIVOT"
Hay un error en el query siguiente, no es 2003, es 2008
este seria el correcto
SELECT company,jul,ago,sep
FROM ( SELECT company,
SUM(case when monthy=’2008-07′ then sales else NULL end) jul,
SUM(case when monthy=’2008-08′ then sales else NULL end) ago,
SUM(case when monthy=’2008-09′ then sales else NULL end) sep
FROM test
GROUP BY company );
Fue de mucha utilidad el ejemplo que pusiste. Aun cuando cuento con oracle 10.x y no puedo usar la cláusula Pivot el procedimiento que describes me ayudó para lograr el objetivo.
Saludos
Muchas gracias por la info.. muy valiosa..!!
Comentarios: