En este grupo En todos

Grupo de Oracle



Trasponer Filas por columnas

Billy
Aruba, Aruba
Escrito por Billy Houdini Helu
el 13/07/2010

Que tal Saludos a todos:


Soy nuevo en esto y estoy entrando al mundo de oracle y PL/SQL DEVELOPER,

Y por este medio pido su ayuda o si alguien ya ah pasado por eso antes,

De antemano gracias a todos!

Con el problema que ahora me encuentro es como trasponer los datos de una vista creada en PL/SQL DEVELOPER, (asi como lo hace excel) voy a tratar de ser lo mas explicito posible.

Query de la siguiente vista

Select * from telefonos

Y muestra los datos asi:

Tel1 | Tel2 | Tel3 | Tel4.......

ValorA

ValorB

ValorC

Asi tengo la vista creada y lo que quiero hacer es trasponer las filas por columnas

Asi:

ValorA | valorB | valorC

Tel1

Tel2

Tel3

...

Hasta ahora solo eh encontrado comandos como rowtocol y pivot pero no entiendo bien como podria aplicarlo en mi situacion.



Paola González
Boyacá, Colombia
Escrito por Paola González
el 02/08/2010

La función decode permite convertir filas a columnas, este es un ejemplo que encontre en donde se utilizan los atributos de la tabla dual: rownum y gubun, rownum siempre la vas a utilizar porque indica la posición en donde quieres que quede el atributo o valor, gubun varia según el atributo que deseas posicionar, espero te sirva, pues con este me he guiado para hacer varias consultas:

Select decode (rownum,1,gubun) c1,

Decode(rownum,2,gubun) c2,

Decode(rownum,3,gubun) c3,

Decode(rownum,4,gubun) c4,

Decode(rownum,5,gubun) c5

From ( select 'F107' gubun from dual union all

select 'F108' from dual union all

select 'F109' from dual union all

select 'F110' from dual union all

select 'F111' from dual ) ;

Este script te generara la siguiente imagen:

C1 C2 C3 C4 C5
---- ---- ---- ---- ----
F107
F108
F109
F110
F111

Como la idea es pasar las columnas como filas, entonces se emplea la función MIN, pra que quede de la siguiente forma:

C1 C2 C3 C4 C5

---- ---- ---- ---- ----

F107 F108 F109 F110 F111


SELECT MIN (DECODE (ROWNUM,1,GUBUN)) VALOR A,

MIN (DECODE (ROWNUM,2,GUBUN)) VALOR B,

MIN (DECODE (ROWNUM,3,GUBUN)) VALOR C,

MIN (DECODE (ROWNUM,4,GUBUN)) C4,

MIN (DECODE (ROWNUM,5,GUBUN)) C5,

FROM (SELECT 'F107' gubun from dual union all

'F108' from dual union all

select 'F109' from dual union all

select 'F110' from dual union all

select 'F111' from dual ) ;




German Garcia Fernandez
Bogotá, Colombia
Escrito por German Garcia Fernandez
el 23/08/2010

Hola. No sé si estoy malinterpretando lo que Paola escribió, pero decode no es una función para transponer. Lo es la función Pivot, implementada desde la versión 11g.

*********************************************************************

Decode: En Oracle/PLSQL, la función decode tiene la funcionalidad de una sentencia IF-THEN-ELSE. Su sintaxis es la siguiente:

Decode( expression , search , result [, search , result]... [, default] )

Un ejemplo (1) sería:

SELECT supplier_name, decode(supplier_id, 10000, 'IBM',
10001, 'Microsoft',
10002, 'Hewlett Packard',
'Gateway') result
FROM suppliers;

Que es equivalente a escribirlo como una sentencia IF-THEN-ELSE así:

IF supplier_id = 10000 THEN
result := 'IBM';

ELSIF supplier_id = 10001 THEN
result := 'Microsoft';

ELSIF supplier_id = 10002 THEN
result := 'Hewlett Packard';

ELSE
result := 'Gateway';

END IF;

*********************************************************************

Ahora, transponer se realiza mediante la cláusula PIVOT. Un artículo(2) de dicha funcionalidad en donde se recrea un buen ejemplo es:

SQL> SELECT almacen, producto, AVG(precio) pmedio
2 FROM productos
3 GROUP BY almacen, producto
4 /

ALMACEN PRODUCTO PMEDIO
------- -------- ------
Ba ABC123 95
Ba DEF456 75
Ba XYZ987 160
Ma ABC123 100
Ma XYZ987 150
Va DEF456 80

6 rows selected.

Basándonos en esta consulta, lo que queremos conseguir es que los distintos productos
(ABC123, DEF456 y XYZ987) lleguen a ser las cabeceras de la consulta. Esto se puede
conseguir modificando la consulta SELECT de la siguiente manera:
SQL> SELECT almacen,
2 AVG(DECODE(producto,'ABC123',precio)) ABC123,
3 AVG(DECODE(producto,'DEF456',precio)) DEF456,
4 AVG(DECODE(producto,'XYZ987',precio)) XYZ987
5 FROM productos
6 GROUP BY almacen
7 ORDER BY almacen
8 /

ALMACEN ABC123 DEF456 XYZ987
------- ------ ------ ------
Ba 95 75 160
Ma 100 150
Va 80

No obstante, aunque la consulta tal y como está escrita funciona, no podemos decir que el llegar a ella sea fácil o intuitivo. Para poder escribir de una manera más sencilla y entendible este tipo de consultas, la versión 11g de las bases de datos Oracle incorpora la nueva cláusula PIVOT . Veamos como quedaría nuestra consulta utilizando la cláusula PIVOT :

SQL> SELECT *
2 FROM (SELECT almacen, producto, precio
3 FROM productos) prod
4 PIVOT (AVG(precio) FOR producto IN
5 ('ABC123','DEF456','XYZ987'))
6 ORDER BY almacen
7 /

ALMACEN 'ABC123' 'DEF456' 'XYZ987'
------- -------- -------- --------
Ba 95 75 160
Ma 100 150
Va 80

*********************************************************************

Espero haber colaborado resolviendo la inquietud y aclarando el tema. Ofrezco excusas por utilizar enlaces externos, pero es más sencillo reutilizar los artículos, por supuesto realizando la correspondiente cita.

*********************************************************************

(1) Ejemplo tomado de https://www.techonthenet.com/oracle/functions/decode. Php

(2) Artículo tomado de https://www.plsql.biz/2008/05/oracle-11g-y-la-clusula-pivot-como. Html