Aprender a usar la cláusula GROUP BY de la sentencia SELECT en tus PL-SQL Packages en Oracle te permitirá construir querys agrupadas por uno o varios campos claves, realizando a la vez sumas de valores, contar la cantidad de registros, buscar el valor mayor y menor, sacar promedios, etc.
Generalmente la creación de grupos de datos en tus PL-SQL Packages en Oracle se hace cuando se debe construir un reporte, ya que siempre se pide mostrar un informe con la información resumida y otro con la información detallada. En los informes resumidos de tus PL-SQL Packages en Oracle se muestran totales por día, por mes, por año, por cliente, por proveedor, por departamento, etc. En tus PL-SQL Packages en Oracle se pueden construir agrupaciones por una serie de criterios, todo depende del tipo de área o rubro de la compañía para la cual se construya el sistema.
Para usar correctamente la cláusula GROUP BY en tus PL-SQL Packages en Oracle se debe conocer con anterioridad el modelo de los datos que se quiere agrupar, ya que primero debes determinar cuáles son los campos clave que se repiten en las tablas por los cuales se debe agrupar. Veamos un ejemplo práctico que permita entender mejor como usar la cláusula GROUP BY en tus PL-SQL Packages en Oracle.
Ejemplo #1: Supone que debes hacer un reporte que entregue el total de tareas realizadas por cada empleado, de cada departamento, dentro del mes y por los 3 primeros meses del año. Veamos cómo se hace esta query:
/* PL-SQL Packages en Oracle */
Select
Dep.nombre_dep departamento,
Emp.nombre_emp empleado,
To_char(tar.fecha_tarea,’mm-yyyy’) Mes-Año,
Count(tar.id_tareas_empleado) tareas
From t_departamento dep, t_empleado emp, t_tareas_empleado tar
Where tar.fecha_tarea between to_date(’01-01-2010’,’dd-mm-yyyy’) and to_date(’31-03-2010’,’dd-mm-yyyy’)
and emp.id_empleado = tar.id_empleado
and dep.id_departamento = emp.id_departamento
Group by
Dep.nombre_dep,
Emp.nombre_emp,
To_char(tar.fecha_tarea,’mm-yyyy’)
Order by
Dep.nombre_dep,
Emp.nombre_emp,
To_char(tar.fecha_tarea,’mm-yyyy’);
TÚ REPORTE: “Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”
Esta query está haciendo un GROUP BY por 3 campos, el nombre del departamento, nombre del empleado y mes-año de las tareas realizadas, fíjate que los campos del Select deben ser los mismos del Group By, solo se pueden agregar campos con funciones de grupo, en este caso solo se usa el Count, pero también se puede usar el Sum, Max, Min, etc. Además también se incluye el Order By por los mismos campos del Group by para que el resultado salga ordenado en tus PL-SQL Packages en Oracle.
Esta query entrega el siguiente resultado:
/* PL-SQL Packages en Oracle */
Departamento Empleado Mes-Año Tareas
CONTABILIDAD LUIS MARDONES 01-2010 365
CONTABILIDAD LUIS MARDONES 02-2010 212
CONTABILIDAD LUIS MARDONES 02-2010 645
CONTABILIDAD MARIO SOLAR 01-2010 735
CONTABILIDAD MARIO SOLAR 02-2010 235
CONTABILIDAD MARIO SOLAR 03-2010 723
FINANZAS MARCELO PEREZ 01-2010 435
FINANZAS MARCELO PEREZ 02-2010 324
FINANZAS MARCELO PEREZ 03-2010 575
FINANZAS JUAN GALVEZ 01-2010 680
FINANZAS JUAN GALVEZ 02-2010 380
FINANZAS JUAN GALVEZ 03-2010 430
En este ejemplo de tus PL-SQL Packages en Oracle solo se está mostrando parte del resultado, ya que solo se muestran 2 departamentos con dos empleados cada uno.
Te propongo que pruebes de inmediato este ejemplo en tu Base de Datos con tus propias tablas, PL-SQL Procedures en Oracle y PL-SQL Function en Oracle, para que comiences a ejercitar la mano y aprendas a dominar esta nueva técnica en tus PL-SQL Packages en Oracle.
Estoy muy interesado en conocer tu opinión y/o comentario sobre este artículo, también cuéntame sobre qué es lo que quieres saber de PL-SQL Packages en Oracle y/o dime cuál es tu principal frustración a la hora de trabajar con PL-SQL Packages en Oracle. Estaré muy atento respondiendo tus preguntas y/o comentarios, gracias.
Saludos
Roberto Vicencio – Escritor del Reporte:
“Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”
Me ha resultado muy interesante el post, aunq creo debe tener tiempo en la web, sin embargo te agradezco el postearlo… GRACIAS
Hola Danyel, me da mucho gusto que este artículo te haya resultado de ayuda, te agredesco mucho el comentario.
Saludos
Roberto Vicencio.
hola roberto, muy bueno tu post, me ayudo a entender mejor la funcionalidad de group by y order by.
Pero fijate que tengo un problema que no he podido resolver yo saco alguna columnas de una tabla usando un select, pero una de esas columnas es un select de otra tabla. entonces al poner la consulta en el group by me da error ya que no se puede poner subquery en el group by.entonces como hago para ordenar cuando una de las columnas a mostar es u select aparte de otra tabla.
Ojala me puedas dar un consejo.
gracias y buen dia.
Hola Veronica, gracias por comunicarte, como buena práctica no es recomendable usar subquerys como columnas ya que peuden disminuir la velocidad de respuesta de la consulta, se debería ocupar solo como último recurso, pero para solucionar tu problema te recomiendo que hagas el group by en un select que este un nivel mas arriba, por ejemplo:
select *
from ( select col1, col2, (select dato from tabla2) col3
from tabla1) dat
group by col3;
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Hola Roberto. Muy bueno tu post. Tengo una pregunta, estoy haciendo un reporte tipo ranking de notarias, pero hay varios registros para una misma notaria y al hacer el reporte salen varios registros como este:
154 GONZALEZ URIA OSCAR EDUARDO 27
126 GONZALEZ URIA OSCAR EDUARDO 44
46 GONZALEZ URIA, OSCAR EDUARDO 275
155 GONZALEZ-VIGIL BALBUENA PERCY 27
82 GONZALEZ-VIGIL BALBUENA PERCY 105
23 GONZALEZ-VIGIL BALBUENA, PERCY 672
Los numero de la izquierda es la posición que ocupa en el ranking y la de la izquierda es el conteo que se hace. Como se podría hacer una comparación y después agrupar por nombres parecidos?. Gracias por tu tiempo. Saludos.
Hola Guido, gracias por comunicarte, no se entiende muy bien el resultado que quieres obtener, que es lo que quieres comparar, para hacer un ranking primero debes definir que criterio se usará para el ranking, por ejemplo cantidad de clientes, valor de los servicios, etc., una vez definido esto debes agrupar para dejar un solo registro por notaria.
PD: Si te ha gustado lo que has visto del blog te invito a compartir el enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda interesar este contenido, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Funciona. Gracias.