GROUP BY

La sentencia GROUP BY identifica una columna seleccionada para utilizarla para agrupar resultados. Divide los datos en grupos por los valores de la columna especificada, y devuelve una fila de resultados para cada grupo.

Puede utilizar GROUP BY con más de un nombre de columna (separe los nombres de columna con comas). Coloque siempre GROUP BY después de FROM y WHERE en una consulta, y antes de HAVING y ORDER BY.

Todas las columnas seleccionadas sin una agregación asociada deben aparecer en la cláusula GROUP BY.

GROUP BY acumula los resultados por grupo, pero no necesariamente ordena los grupos; para ordenarlos se necesita una sentencia ORDER BY. Cuando recupere múltiples filas de una tabla, puede utilizar las cláusulas GROUP BY, HAVING y ORDER BY para indicar:
  • Cómo desea agrupar las filas (GROUP BY)
  • Una condición que las filas, como grupo, deben cumplir (HAVING)
  • El orden en que desea que se devuelvan las filas (ORDER BY)
Por ejemplo, la consulta siguiente selecciona el salario promedio para cada departamento:
SELECT DTO, AVG(SALARIO)
FROM Q.PLANTILLA           
GROUP BY DTO
Esta consulta produce el informe siguiente:
    DTO                 COL1
  ------  ------------------
      10    20865,8625000000
      15    15482,3325000000
      20    16071,5250000000
      38    15457,1100000000
      42    14592,2625000000
      51    17218,1600000000
      66    17215,2400000000
      84    16536,7500000000

En el ejemplo anterior, GROUP BY divide la tabla en grupos de filas con el mismo número de departamento, y devuelve una fila de resultados para cada grupo. La columna DTO se puede seleccionar sin una función incorporada porque se utiliza con GROUP BY y porque cada miembro del grupo tiene el mismo valor en la columna DTO. Todos los nombres de columna incluidos en una cláusula SELECT deben tener asociada una función incorporada o aparecer en la cláusula GROUP BY. Por ejemplo, si DTO no se utiliza en la cláusula GROUP BY, la lista de salarios promedio tiene poco significado.

La siguiente consulta es correcta:

SELECT DTO, AVG(SALARIO), TAREA
FROM Q.PLANTILLA           
GROUP BY DTO, TAREA

La siguiente consulta es incorrecta:

SELECT DTO, AVG(SALARIO), TAREA
FROM Q.PLANTILLA           
GROUP BY DTO

Generalmente, GROUP BY produce una fila de un informe para cada distinto valor de la columna especificada en la cláusula GROUP BY. Cuando se mencionan varias columnas en la cláusula GROUP BY, se produce una fila nueva en el informe cada vez que cambia un valor en una de las columnas. Sin embargo, si hay valores nulos en la columna, cada valor nulo se trata como un grupo separado que consta de un miembro.

La utilización de GROUP BY en SQL es una alternativa a la utilización del código de uso GRUPO en el formato. GROUP BY proporciona una ampliación a la agrupación que se puede especificar en el formato y permite la selección condicional de datos, lo cual no se puede realizar en el formato. Por ejemplo, para ver el salario mínimo, máximo y promedio del total de salarios del departamento:

  1. Escriba y ejecute la siguiente consulta:
    SELECT DTO, SUM(SALARIO), SUM(SALARIO), SUM(SALARIO)
    FROM Q.PLANTILLA           
    GROUP BY DTO
  2. Utilice estos códigos de uso en el formato:
    NUM ENCABEZAMIENTO COLUMNA                 USO
    --- -----------------------------------    -------
     1  DTO
     2  SUM(SALARIO)                           MINIMO
     3  SUM(SALARIO)1                          PROMED
     4  SUM(SALARIO)2                          MAXIMO

El informe contiene cuatro columnas, de las cuales las tres últimas son casi idénticas. Las tres muestran el salario total para cada departamento; pero la fila final muestra el mínimo, el promedio y el máximo de los totales.

Ejemplos adicionales:

  • Para listar el salario máximo y mínimo por tarea para cada departamento, excluyendo los directores, utilice una consulta como la siguiente:
    SELECT DTO, TAREA, MIN(SALARIO), MAX(SALARIO)
    FROM Q.PLANTILLA           
    WHERE TAREA < >'DTOR'
    GROUP BY DTO, TAREA
  • Para listar, para cada número de años de servicio, el número de empleados que con dicho número de años y sus salarios promedio, utilice una consulta como la siguiente:
    SELECT AÑOS, COUNT(*), AVG(SALARIO)
    FROM Q.PLANTILLA           
    GROUP BY AÑOS

    La palabra clave HAVING debe utilizarse con datos agrupados. Cuando la sentencia HAVING y la sentencia GROUP BY se utilizan juntas, la sentencia HAVING debe seguir a la sentencia GROUP BY.

  • Para listar el salario mínimo, máximo y promedio de cada departamento, excluyendo los directores, para departamentos con un salario promedio superior a 12.000 dólares, utilice una consulta como la siguiente:
    SELECT DTO, MIN(SALARIO), MAX(SALARIO), AVG(SALARIO)
    FROM Q.PLANTILLA           
    WHERE TAREA < >'DTOR'
    GROUP BY DTO
    HAVING AVG(SALARIO) > 12000
  • Para listar, para cada número de años de servicio, el número de empleados con ese número de años y sus salarios promedio, pero sólo para grupos con más de dos empleados, utilice una consulta como la siguiente:
    SELECT AÑOS, COUNT(*), AVG(SALARIO)
    FROM Q.PLANTILLA           
    GROUP BY AÑOS
    HAVING COUNT(*) > 2