Ir al contenido principal

Pivot PL/SQL - ORACLE 11G

En Oracle 11g una de las muchas funcionalidades incorporada en dicha versión es la solución a muchos de nuestro problemas, que en versiones anteriores teníamos que recurrir a la expresión CASE.

Recordemos que el operador Pivot se encarga de presentar información en un informe con referencias cruzadas con formato de planilla de cálculo a partir de cualquier tabla relacional usando código PL/SQL intermedio (dependiendo el caso que se presente), y almacena dichos datos en una tabla con referencias cruzadas de un determinado almacén (base de datos).

Además en el mundo de BI o OLAP un pivot es conocido como tablas de doble entrada, multidimensionales o simplemente conocidos con cross table (tablas cruzadas).

Consideracioness:
Son utilizadas asociadas a funciones de agrupamiento tales como SUM, COUNT, MIN, MAX, entre otros.
Se recomienda usar alias cuando se va a realizar más de una función agregada.
El título de la columna corresponderá a la lista de valores o alias de cada valor que agrega en el operador FOR.
Además se recomienda especificar el alias para que el valor tomará el alias.
No se recomienda usar funciones de agregación en el operador FOR, para esto se recomienda hacer uso de vistas.

Sintaxis:
Select * from nombre_tabla  -- Origen de datos
Pivot  --Operador Pivot
( fn_agregada_1() Alias_1,  -- Funciones agrupadas a mostrar
  Fn_agregada_2() Alias_2,
 For (campo_1 Alias_1 ,
      Campo_2 Alias_2  -- Campos donde se genera el pivot)
      In(Lista de valores)  -- Filtros para generar las columnas

 )
Para el siguiente ejemplo de nuestra implementación haciendo uso del operador Pivot haremos uso de la tabla employees de la Schema HR.

1. Construir query de origen de datos.


SELECT  DEPARTMENT_ID, TO_CHAR(HIRE_DATE,'YYYY'), SUM(SALARY)
FROM    EMPLOYEES
WHERE   DEPARTMENT_ID IS NOT NULL
AND     SALARY IS NOT NULL
AND     DEPARTMENT_ID BETWEEN 50 AND 100
GROUP BY DEPARTMENT_ID, TO_CHAR(HIRE_DATE,'YYYY')
ORDER BY DEPARTMENT_ID, TO_CHAR(HIRE_DATE,'YYYY');




Lo que nuestro query hace es mostrar los departamentos que se encuentra en el rango del 50 al 100 en determinados años y agrupados en ambos, así mismo muestra la suma del salario según los principales datos. En el siguiente caso nos pide mostrar la suma del salario por todos los año según el DEPARTMENT_ID. Para este caso, lo primero que se nos ocurre es transponer las filas a columnas.  

2. Recordemos a la implementa con la expresión CASE.


SELECT  DEPARTMENT_ID,
          SUM( CASE TO_CHAR(HIRE_DATE,'YYYY')
               WHEN '2001' THEN SALARY ELSE 0 END) AS "AÑO-2001",
          SUM( CASE TO_CHAR(HIRE_DATE,'YYYY')
               WHEN '2002' THEN SALARY ELSE 0 END) AS "AÑO-2002",
          SUM( CASE TO_CHAR(HIRE_DATE,'YYYY')
               WHEN '2003' THEN SALARY ELSE 0 END) AS "AÑO-2003",
          SUM( CASE TO_CHAR(HIRE_DATE,'YYYY')
               WHEN '2004' THEN SALARY ELSE 0 END) AS "AÑO-2004",
          SUM( CASE TO_CHAR(HIRE_DATE,'YYYY')
               WHEN '2005' THEN SALARY ELSE 0 END) AS "AÑO-2005",
          SUM( CASE TO_CHAR(HIRE_DATE,'YYYY')
               WHEN '2006' THEN SALARY ELSE 0 END) AS "AÑO-2006",
          SUM( CASE TO_CHAR(HIRE_DATE,'YYYY')
               WHEN '2007' THEN SALARY ELSE 0 END) AS "AÑO-2007",
          SUM( CASE TO_CHAR(HIRE_DATE,'YYYY')
               WHEN '2008' THEN SALARY ELSE 0 END) AS "AÑO-2008"
FROM    EMPLOYEES
WHERE   DEPARTMENT_ID IS NOT NULL
AND     SALARY IS NOT NULL
AND     DEPARTMENT_ID BETWEEN 50 AND 100
GROUP BY DEPARTMENT_ID
ORDER BY DEPARTMENT_ID;



Todo bien hasta ahora, se logró lo que nos solicitaron, pero, que pasa sí es que tenemos muchos años más de lo que hasta ahora mostramos, es decir los años desde el 1980 al 2015, tendríamos que replica 35 veces nuestra función de agrupamiento de nuestra expresión CASE. 
   
3. Crear la vista con el query de origen de datos (no siempre es necesario crear vistas).


CREATE OR REPLACE VIEW V_EMPLOYEES_HIRE_DATE
AS
SELECT  DEPARTMENT_ID, TO_CHAR(HIRE_DATE,'YYYY') AS HIRE_DATE, SALARY
FROM    EMPLOYEES
WHERE   DEPARTMENT_ID IS NOT NULL
AND     SALARY IS NOT NULL
AND     DEPARTMENT_ID BETWEEN 50 AND 100;

4. Ahora veremos la implementación con el Operador Pivot, lograremos el mismo resultado pero con menos línea de código.

SELECT * FROM (SELECT  DEPARTMENT_ID, HIRE_DATE, SALARY
                FROM    V_EMPLOYEES_HIRE_DATE )
                PIVOT
                (SUM(SALARY)
                      FOR HIRE_DATE IN (2001,2002,2003,2004,2005,2006,2007,2008)
                      )
ORDER BY 2 DESC;

Lo que se logra con el operador Pivot es que los filtros para la construcción de las columnas, solo será cuestión de agregar nuevos valores (FOR HIRE_DATE IN (2001,...., nuevo_filtros)) en el operador FOR.

Comentarios

Entradas más populares de este blog

Habilitar Usuario HR Oracle

Al realizar la primera instalación del Oracle, el usuario HR por defecto está bloqueado y por ende no podemos loguearnos como dicho usuario, lo que debe hacer son los siguiente pasos, aplicables para Linux o Windows.
1. Conectarse como usuario system o sysdba + contraseña haciendo uso del comando connect.
Usuario: system
Password: xxxx 


2. Hacer uso  del comando alter user hr account unlock desbloqueamos la cuenta.
alter user hr account unlock;

3. Escribimos el comando alter user HR identified by hr; con esto estamos diciendo que la contraseña será hr.

alter user HR identified by hr;

4. Ahora testeamos la conexión con el comando - conn hr/hr@xe. Si deseas después de conectarnos se puede realizar un select a la tabla employees del hr.


Resultado del select realizado
5. Con todos estos pasos realizados ya podemos logearnos desde cualquier IDE como el usuario hr  y la contraseña hr que definimos en el paso 3. 
Para finalizar nos loguearemos con el IDE Oracle SQL Developer.

Espero les sea de utilidad,…

Usuario SYS y SYSTEM - ORACLE

Usuario SYS y SYSTEM
Ambos usuario son creados de forma automática al crear la base de datos ORACLE y se otorga el rol de DBA.

SYS (password por defecto: CHANGE_ON_INSTALL).
SYSTEM (password por defecto: MANAGER).

Lo que se recomienda es cambiar el password de ambos usuarios por el tema de seguridad.

SYS:
Todas las tablas y vistas para el diccionario de datos de la base de datos están almacenados en el esquema SYS. Estas tablas y vistas son críticas para el funcionamiento de la base de datos ORACLE. Para mantener la integridad del diccionario de datos, las tablas del esquema SYS son manipulados solo por la base de datos. Nunca se debería modificar algo o crear tablas en el esquema del usuario SYS.

SYSTEM:
El usuario SYSTEM se utiliza para crear tablas y vistas adicionales que muestran información administrativa, tablas internas y vistas utilizado por varias opciones y herramientas de la base de datos ORACLE. No se recomienda utilizar el esquema SYSTEM para almacenar tablas de interés para usu…

Parámetro de entrada y salida – PL/SQL

Parámetro de entrada y salida – PL/SQL:
Los parámetros de entrada y salida no son los parámetros de inicialización de la base de datos ORACLE. Los parámetros de entra y salida son utilizados mayormente en implementaciones de funciones, procedimientos almacenados o bloques de código bajo el lenguaje del PL/SQL, se considera que ambos parámetros (entra y salida) puedan realizar operaciones en el mismo bloque PL/SQL, es decir, si enviamos un parámetro de entrada hará que cumpla cierta operación y retornara los valores de salida de dicha operación procesada de acuerdo al parámetro de ingresado. Es de acuerdo al caso que nos presenta en la implementación.
Algo importante al definir los parámetros, es saber y considerar cuántos tipos de parámetro existe si solo hablamos de entrada y salida, en realidad mi determinación seria 3 tipos:

Parámetros:

IN – entrada
OUT – salida
IN OUT – entrada salida

Parámetro IN – entrada:
El comportamiento común de estés tipos de parámetros es estar siempre pendiente d…