Agrupar registros usando GROUP BY en Oracle

En este artículo vamos aprender a agrupar registros usando GROUP BY en Oracle de una tabla. Esta cláusula divide en grupos las filas devueltas por el SELECT. Para cada grupo puedes utilizar las diferentes funciones de agregación disponibles.

Sintaxis

La cláusula group by se escribe después del FROM o después del WHERE si tuviese. Debe contener todos los campos que aparezcan en el SELECT que no tienen función de agregación.

La sintaxis básica es:

select campo, sum(cantidad)
from nombreTabla
where condicion
group by campo
order by campo;

La cláusula GROUP BY admite alias del SELECT, FROM o la posición de los campos en el SELECT

Ejemplos

Usaremos la siguiente tabla llamada empleados para realizar los ejemplos (al final de la página está disponible el script para crearla)

Agrupación con funciones de agregación

La forma de agrupar más habitual es escribir en el select y group by todos los campos por los que se quiera agrupar y escribir en el select un campo con una función de agregación. En el siguiente ejemplo mostramos la media de los sueldos por puesto de trabajo:

select puesto,
 avg(sueldo)
from empleados
group by puesto;
Agrupar registros usando GROUP BY en Oracle

Agrupación sin funciones de agregación

El siguiente ejemplo es poco utilizado ya que la cláusula GROUP BY actúa como si fuese un DISTINCT:

select puesto
from empleados
group by puesto;

Ejemplo completo

Copia y pega el siguiente código en tu consola de PostgreSQL y realiza paso a paso leyendo los comentarios.

-- www.MiguelTroyano.com
-- Borramos la tabla si existe
drop table empleados;

-- Creamos la tabla
create table empleados
(
    id_empleado numeric(2,0),
    id_departamento numeric(2,0),
    nombre character varying(50),
    puesto character varying(50),
    fecha_alta date,
    sueldo integer
);

-- Insertamos valores
insert into empleados values (1,1,'Miguel Troyano','Analista',to_date('26/09/1986','DD/MM/YYYY'),60000);
insert into empleados values (2,1,'Ismael Troyano','Analista',to_date('01/01/2001','DD/MM/YYYY'),60000);
insert into empleados values (3,1,'Jose Troyano','Alta Dirección',to_date('01/01/2001','DD/MM/YYYY'),80000);
insert into empleados values (4,1,'Pilar Redondo','Alta Dirección',to_date('02/02/2002','DD/MM/YYYY'),80000);

-- Mostramos la media del sueldo de la tabla empleados
-- agrupado por puesto
select puesto,
 avg(sueldo)
from empleados
group by puesto;

-- Mostramos los diferentes puestos
select puesto
from empleados
group by puesto;

Escribir un comentario

Este sitio está protegido por reCAPTCHA y se aplican la política de privacidad y los términos de servicio de Google.