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