2.3. Funciones de agregación

Las funciones de agregación o agrupamiento son funciones que toman una colección de valores y devuelven como resultado un único valor.

Las funciones de agrupamiento que se pueden utilizar en Oracle son las siguientes.

Función Descripción
AVG(col) Promedio de todos los valores de la columna col.
COUNT(col) Cuenta el número de filas agrupadas.
MAX(col) Valor máximo de todos los valores de la columna col.
MIN(col) Calcula el valor mínimo de todos los valores de la columna col.
SUM(col) Suma de los valores de la columna col.
STDDEV(col) Desviación estándar de los valores de la columna col.
VARIANCE(col) Varianza de los valores de la columna col

National Basketball AssociationEjemplo: Calcular el salario mínimo, promedio y máximo de los jugadores de la NBA (National Basketball Association -Asociación Nacional de Baloncesto-), del campeonato 2016-2017.

CREATE TABLE nba (
  idJugador   NUMBER(3),
  nombre      CHAR(40),
  equipp      CHAR(25),
  salario     NUMBER(9)
);

SELECT MIN(salario) Minimo,
       ROUND(AVG(salario),2) Media,
       MAX(salario) Maximo
FROM nba

SELECT TO_CHAR( MIN(salario), '999,999,999')         Mínimo,
       TO_CHAR( ROUND(AVG(salario),0),'999,999,999') Media,
       TO_CHAR( MAX(salario), '999,999,999')         Máximo
FROM nba


Observe que los valores nulos no participan en el cálculo de las funciones de conjuntos. Estas funciones se pueden utilizar con las cláusulas DISTINCT y ALL. También se pueden utilizar aunque no realicemos agrupación alguna en la consulta, considerando a toda la tabla como un grupo.

GROUP BY

La cláusula GROUP BY combina los registros con valores idénticos en la lista de campos especificada en un único registro. Para cada registro se puede crear un valor agregado si se incluye una función SQL agregada como por ejemplo SUM o COUNT, en la instrucción SELECT. Su sintaxis es:

SELECT [ALL | DISTINCT] 
      <nombre_campo> [{,<nombre_campo>}] 
               [{,<funcion_agregación>}]
               FROM <nombre_tabla>|<nombre_vista> 
[{,<nombre_tabla>|<nombre_vista>}]
[WHERE <condición> [{ AND|OR <condición>}]]
[GROUP BY <nombre_campo> [{,<nombre_campo >}]]
[HAVING <condición>[{ AND|OR <condición>}]]
[ORDER BY <nombre_campo>|<campo_índice> [ASC | DESC]

[{,<nombre_campo>|<campo_índice> [ASC | DESC ]}]]

En la cláusula GROUP BY se colocan las columnas por las que vamos a agrupar. Y en la cláusula HAVING filtra los registros una vez agrupados.

La evaluación de las diferentes cláusulas en tiempo de ejecución, se efectúa en el siguiente orden:

Cláusula Descripción
WHERE Filtra las filas
GROUP BY Crea una tabla de grupo nueva
HAVING Filtra los grupos
ORDER BY  Clasifica la salida

Los valores NULL en los campos de GROUP BY se agrupan y no se omiten. Sin embargo, los valores NULL no se calculan en ninguna función de agregado SQL.

Ejemplo: Consultar el salario mínimo, promedio y máximo de los jugadores NBA temporada 2016 - 2017

SELECT equipo,
       TO_CHAR( MIN(salario), '999,999,999')         Mínimo,
       TO_CHAR( ROUND(AVG(salario),0),'999,999,999') Media,
       TO_CHAR( MAX(salario), '999,999,999')         Máximo
FROM nba
GROUP BY equipo
ORDER BY equipo

Ejemplo: Considere los alumnos inscritos en las materias que impartí durante cierto periodo en el ITV. La siguiente consulta obtiene el número de alumnos por género y materia.

SELECT Genero, COUNT(*) Alumnos
FROM alumnosITV
GROUP BY Genero

Ejemplo: Para ser campeón de la NBA hay que ganar cuatro partidos de siete. El ejemplo muestra el número de juegos necesarios para ser campeón de 1950 a la fecha.

SELECT ganados, perdidos, 
       COUNT(*) ocurrencias
FROM campeonesNBA
GROUP BY ganados, perdidos
ORDER BY ganados, perdidos


A partir de la fuente proporcionada aquí genere sus resultados. Además desarrolle una consulta para obtener los MVP y su número de distinciones

HAVING

La cláusula HAVING se utiliza para especificar una condición, se comporta como WHERE, con la diferencia que HAVING se aplica a grupos y no a tuplas (registros). Es decir HAVING filtra los registros agrupados.

Ejemplo: Considere la siguiente información relativa a automoviles, modelos y precios

Modelo Año Precio
SABLE 2001 50,000
AUDI-A4 2007 420,000
BMW-323 2000 115,000
PORSCHE BOXSTER-987 2002 310,000
MALIBU 1998 32,000
STRATUS-RT 2005 97,500
CHRYSLER 300-C 2005 185,000
FUSION 2006 150,000
CUTLASS EUROSPORT 1992 25,000
CIVIC COUPE 2006 135,000
CIVIC LS-4L 2004 89,000
ACCORD EXR-L4 1998 53,000
PLATINA 2005 65,000
PLATINA 2004 60,000
ALTIMA 2003 92,000
ALTIMA 2007 179,000
ALTIMA 2005 105,000
PEUGEOT 206 XR 2006 65,000
TOYOTA COROLLA XRS 2009 190,000
VW SEDAN 1998 25,000

Calcule el promedio por año para todas las marcas a partir del 2003.

CREATE TABLE carros (
  modelo  CHAR(25),
  year    CHAR(4),
  precio  NUMBER
);
SELECT year,
  TO_CHAR(AVG(precio),'999,999.22') media
FROM carros 
GROUP BY year
HAVING year > 2002
ORDER BY year;