Aprender a transformar las filas en columnas de una tabla, te permitirá mostrar los datos de una forma diferente a lo habitual en tus PL/SQL Procedures en Oracle, donde la información se podrá apreciar desde distintos ángulos y perspectivas.
Cuando trabajas construyendo PL/SQL Procedures
A muchos desarrolladores les cuesta construir este tipo de tareas y de hecho puede llegar a ser una tarea muy difícil que muchos no logran finalizar, y si lo logran han debido construir un código gigantesco.
A mí siempre me ha gustado buscar la simplicidad para hacer las cosas; y logre encontrar una forma más simple de convertir las filas a columnas de una tabla, la que cuando la descubrí, me sorprendió mucho por lo fácil que es de implementar en los PL/SQL Procedures en Oracle. Revisemos de inmediato esta técnica con un ejemplo práctico de como se debe hacer.
Ejemplo #1: Supone que tienes una tabla que contiene los posibles estados civiles de una persona, los que debes mostrar como columnas, veamos como hacerlo:
Tabla t_estado_civil: Esta tabla contiene 5 estados civiles definidos para mostrarlos como columna.
/* PL-SQL Procedures en Oracle */
— Tabla estado civil —
Create Table T_Estado_Civil
(
Id_Estado_Civil Number(10),
Descripcion Varchar2(100 Byte)
)
— Datos estado civil —
Id_Estado_Civil Descripcion
============ ===========
1 SOLTERO
2 CASADO
3 SEPARADO
4 VIUDO
5 OTROS
/* PL-SQL Procedures en Oracle */
/* PL-SQL Procedures en Oracle */
Select
‘Estados:’ titulo,
max( decode( eciv.id_estado_civil, 1, eciv.descripcion)) col_1,
max( decode( eciv.id_estado_civil, 2, eciv.descripcion)) col_2,
max( decode( eciv.id_estado_civil, 3, eciv.descripcion)) col_3,
max( decode( eciv.id_estado_civil, 4, eciv.descripcion)) col_4,
max( decode( eciv.id_estado_civil, 5, eciv.descripcion)) col_5
From t_estado_civil eciv;
/* PL-SQL Procedures en Oracle */
Esta simple query permite mostrar las filas de la tabla t_estado_civil como columna, mostrándolas de la siguiente forma:
/* PL-SQL Procedures en Oracle */
Titulo col_1 col_2 col_3 col_4 col_5
======== ======== ======== ======== ======== ========
Estados: SOLTERO CASADO SEPARADO VIUDO OTROS
/* PL-SQL Function en Oracle */
El truco se encuentra en utilizar la función de grupo MAX, la que permite obtener el valor máximo o mayor de una columna.
Ejemplo #2: En el ejemplo anterior se logró mostrar las filas como columnas de la tabla t_estado_civil, veamos ahora como mostrar datos congruentes con estas columnas, usando la misma técnica:
/* PL-SQL Procedures en Oracle */
— Tabla empleados —
Create Table T_Empleado
(
Id_Empleado Number(10),
Id_Departamento Number(10),
Id_Estado_Civil Number(10)
);
— Datos empleados —
Id_Empleado Id_Departamento Id_Estado_Civil
========== ============= ============
1 101 1
2 101 1
3 101 4
4 102 3
5 102 1
6 102 3
7 105 2
8 105 3
9 105 1
10 105 5
— Query con estado civil y departamentos de empleados —
Select
‘Estados’ departamento,
max( decode( eciv.id_estado_civil, 1, eciv.descripcion)) col_1,
max( decode( eciv.id_estado_civil, 2, eciv.descripcion)) col_2,
max( decode( eciv.id_estado_civil, 3, eciv.descripcion)) col_3,
max( decode( eciv.id_estado_civil, 4, eciv.descripcion)) col_4,
max( decode( eciv.id_estado_civil, 5, eciv.descripcion)) col_5
From t_estado_civil eciv
Union All /* PL-SQL Procedures en Oracle */
Select
to_char(emp.id_departamento) departamento,
to_char( sum( decode( emp.id_estado_civil, 1, 1, 0))) cant_col_1,
to_char( sum( decode( emp.id_estado_civil, 2, 1, 0))) cant_col_2,
to_char( sum( decode( emp.id_estado_civil, 3, 1, 0))) cant_col_3,
to_char( sum( decode( emp.id_estado_civil, 4, 1, 0))) cant_col_4,
to_char( sum( decode( emp.id_estado_civil, 5, 1, 0))) cant_col_5
From t_empleado emp
Group By
emp.id_departamento;
/* PL-SQL Procedures en Oracle */
A la query del primer ejemplo, se agrego una segunda query unida por el union all, para obtener la cantidad de estados civiles acumulados por cada departamento. Esta consulta entrega los siguientes resultados:
/* PL-SQL Procedures en Oracle */
Departamento col_1 col_2 col_3 col_4 col_5
============ ======== ======== ========= ======== ========
Estados: SOLTERO CASADO SEPARADO VIUDO OTROS
102 1 0 2 0 0
101 2 0 0 1 0
105 1 1 1 0 1
/* PL-SQL Procedures en Oracle */
El truco en esta segunda query se encuentra en la función de grupo SUM la que permite unificar los datos en una sola fila.
Para hacer esta transformación mas fácil, desde la versión 11g Oracle incluyo la cláusula PIVOT, que permite hacer esta misma funcionalidad obteniendo identicos resultados.
/* PL-SQL Procedures en Oracle */
— Ahora usando PIVOT —
Select *
From (
Select
0 Id_Estado_Civil,
‘Estados:’ Descripcion
From Dual
Union All
Select
Id_Estado_Civil,
Descripcion
From T_Estado_Civil
) Dat
Pivot
(Max(Descripcion) For Id_Estado_Civil
In (0 Departamento, 1 Col_1,2 Col_2, 3 Col_3, 4 Col_4, 5 Col_5))
Union All
Select
To_Char(Id_Departamento) Id_Departamento,
To_Char(Col_1) Col_1,
To_Char(Col_2) Col_2,
To_Char(Col_3) Col_3,
To_Char(Col_4) Col_4,
To_Char(Col_5) Col_5
From (
Select *
From T_Empleado
Pivot
(Count(Id_Empleado) For Id_Estado_Civil
In (1 Col_1, 2 Col_2, 3 Col_3, 4 Col_4, 5 Col_5))
) Dat
/* PL-SQL Procedures en Oracle */
Como ves para hacer esta transformación he incluido 2 métodos, si trabajas con la versión 11g o superior te recomiendo usar PIVOT, de lo contrario usa el método tradicional.
Prueba de inmediato estos ejercicios en los programas que debas desarrollar en la Base de Datos Oracle y aplica lo aprendido en tus PL/SQL Procedures en Oracle y PL/SQL Function en Oracle.
Si te fijas en estos ejemplos solo ocupe unos SELECT simples de manera que sea fácil de entender, pero sé que en tu realidad necesitas crear consultas más complejas que esto, donde se ocupan muchas más tablas.
Por eso te recomiendo que veas la siguiente página donde explico porque debes dejar de usar SELECT simples y comenzar a usar SELECT de Múltiples Tablas…
Si combinas la técnica para crear SELECT Múltiples (que explico en video) con la técnica para transformar filas en columnas estarás dando un gran paso para dominar el Lenguaje PL/SQL. Comienza ya a practicar estas técnicas y aplícalas en tus programas de Oracle.
Saludos,
Roberto Vicencio
Para Tu Éxito con Oracle