Mi?rcoles, 08 de julio de 2015

Día muy productivo y con una satisfacción más, el día de ayer me llamó la atención un comando de Oracle que tiene que ver con el GROUP BY tan conocido y útil por la gente que manejamos SQL, el día de hoy me puse manos a la obra para resolver un reporte que me habían pedido.

Vamos a verlo con la base de datos de ejemplo que trae la versión express.

Hacemos la pregunta de cuantas personas tenemos por departamento y por nombre de puesto de nuestra tabla EMPLOYEES.

Bien, muy rudimentario, pero es para empezar. Quien solicita la información quiere totales por departamento y que puestos tiene. Gracias al compañero Juan Amilcar, nos mostró en determinado momento como podiamos sacar estos totales con un solo script. Algo parecido a lo que muestro a continuación.

Pegamos las consultas por medio de la instrucción UNION ALL, entiendo que tenemos que tener la misma estructura en las dos consultas, por ello creo el campo JOB_ID y lo relleno de 'A's' (Esto para que a la hora del ordenamiento la mande al principio), con esto tenemos los totales ahora desordenados, pero seguimos en el objetivo de dar respuesta al usuario.

Para darle un poquito más de vista, vamos a ordenar el resultado de esta consulta.

Si somos para unos "prácticos" para otros "flojos", podemos decirle al cliente que ya esta su consulta...pero rememorando a mi estimado Maestro Enrique Arámbula cuando le entregamos un proyecto en su materia, solo con lo mínimo, me dijo algo así como que le diera más vista al proyecto, yo objete un poco y que nos dice "¡¡¿¿¿rancheros y a pata??!!, si somos rancheros pues mínimo ponerse unos huarachitos, un sombrero..." refiriendose a que hay que poner atención a la presentación.

Entonces haciendo caso a las palabras de mi maestro, ponemos los nombres del departamento y el nombre del puesto y no sus id's como lo mostramos anteriormente.

Podemos observar que como 'AAAAAAA' no tiene una correspondencia en la tabla JOBS, usamos un LEFT RIGHT para que que no omita los totales que es el objetivo de la consulta. Señale en azul lo anterior y los resultados de los totales.

Pudiera dejar que mi compañera que me apoya en la edición en Excel, le cambiara el null por la leyenda "Total", pero aparte de ponernos huaraches y sombrero, veamonos más elegantes portando de esos pañuelos rojos estampados usados por la gente del campo, cambiando el null por la leyenda "Total" usando un CASE.


Y bueno esto requirió de un poco de inspiración del programador de antaño.

Ante una consulta que me hizo mi compañero de trabajo y amigo Mauricio en las páginas de un instructivo me encontré las instrucciones ROLLUP y CUBE, y con esto lo que les acabo de exponer pareciera ya no tan interesante.

Reza el manual - Libro.

"2.16 Rollup - Rollup se usa en un group by para agregar el total del sub grupo.

2.17 Cube - Cube es parecido al Rollup pero da los totales de todos los grupos posibles" [1]

Entonces aunque en el trabajo aplique el CUBE, aquí les mostraré el ROLLUP.

Vemos como los totales se ponen al final de cada DEPARTMENT_ID con el valor null en JOB_ID.

Vamos a ponerles los huaraches, el sombrero y el pañuelo, usando los JOIN's.

Y bueno resuelto por medio de Rollup. Yo use CUBE ya que necesitaba más subtotales, y por medio de un filtro quite los que no necesitaba. Espero les sirva esta solución.

Profesor Enrique Nash.

[1] S. Cédric. Curso de SQL avanzado y PL/SQL básico para Oracle 10g (10.2). pp. 10, 2008.



Tags: Oracle 11g, Base de datos, PL/SQL, Rollup

Publicado por neofito69 @ 15:52  | Base de datos
Comentarios (1)  | Enviar
Comentarios
Publicado por robert70
Viernes, 10 de julio de 2015 | 9:58

1