SQL GROUP BY Declaración


¿Que es Group By? -Es una clausula que agrupa registros para consultas detalladas¿Cuando usamos "Group By"? -Esta clausula se utiliza para organizar registros en grupos y obtener un resumen de dicho grupo. Cabe destacar que las funciones de grupo solas, producen un valor de resumen por cada grupo especificado.
Ejemplo
SELECT SUM(SALARY), DEPARTMENT_ID
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;
Asi se solicita el salario que paga la empresa por cada Departamento.


La declaración de Group by

La Clausula GROUP BY se utiliza en conjunción con las funciones agregadas al grupo del conjunto de resultados de una o más columnas.

SELECT campo, funcion_agregada(campo) FROM tble_name GROUP BY campo,campo1,campoN ;

Base de datos de demostración

En este tutorial vamos a utilizar la base de datos de ejemplo Hr conocida.
Ejemplo
SELECT FIRST_NAME, AVG(SALARY)
FROM EMPLOYEES
GROUP BY FIRST_NAME;
Ejemplo sencillo usado como introducción


Funciones con Group By:

Si utiliza una función de grupo en un comunicado que no contiene GROUP BY cláusula, que es equivalente a la agrupación en todas las filas.

Para argumentos numéricos, las funciones Varianza y desviación estándar devuelven un DOBLE valor. El SUM ()y AVG () devuelven un DECIMAL valor para los argumentos de valor exacto (entero o DECIMAL ), y una DOBLE valor para los argumentos de aproximada-valor ( FLOAT o DOUBLE ). (Antes de MySQL 5.0.3, SUM () y AVG ()retorno DOBLE para todos los argumentos numéricos.)

El SUM () y AVG () funciones de agregado no funcionan con los valores temporales. (Se convierten los valores a números, perdiendo todo después de que el primer carácter no numérico.) Para evitar este problema, convertir a unidades numéricas, realice la operación agregada, y convertir de nuevo a un valor temporal. Ejemplos:
SELECT DEPARTMENT_ID, SUM(SALARY), AVG(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;
Esta instruccion nos da la suma y la media de los salarios por cada departamento.

Las funciones como SUM () o AVG () que esperan un argumento numérico echan el argumento en un número si es necesario. Para SET o ENUM valores, la operación de conversión hace que el valor numérico subyacente para ser utilizado.

  • AVG ([DISTINCT]expr)

Devuelve el valor medio de expr . El DISTINCT opción se puede usar desde MySQL 5.0.3 para volver a la media de los valores distintos de expresion .

AVG () devuelve NULL si no hay filas coincidentes.
SELECT FIRST_NAME, GROUP_CONCAT(FIRST_NAME) FROM EMPLOYEES GROUP BY FIRST_NAME;
  • COUNT (expr)

Devuelve un recuento del número de no- NULL valores de expr en las filas recuperadas por un SELECT comunicado. El resultado es un BIGINT valor.

COUNT () devuelve 0 si no hay registros coincidentes.
SELECT FIRST_NAME, COUNT(*)
FROM EMPLOYEES
GROUP BY FIRST_NAME;

COUNT (*) nos dice cuantas veces se repite cada FIRST_NAME en la instrucción.

COUNT (*) es algo diferente, ya que devuelve un recuento del número de filas recuperadas, si contienen o no NULL valores.

COUNT (*) está optimizado para retornar muy rápidamente si el SELECT recupera de una tabla, no se recuperan otras columnas, y allí no es DONDE cláusula. Por ejemplo:
SELECT COUNT(*) FROM EMPLOYEES;
*Numero de empleados.

COUNT (DISTINCTexpr,[expr...])

Devuelve un recuento del número de filas con distintas no NULL expr valores.

COUNT (DISTINCT) devuelve 0 si no hay registros coincidentes.
SELECT DISTINCT COUNT(FIRST_NAME)
FROM EMPLOYEES
GROUP BY FIRST_NAME;
En MySQL, puede obtener el número de combinaciones de expresiones distintas que no contienen NULL dando una lista de expresiones. En SQL estándar, tendría que hacer una concatenación de todas las expresiones dentro de COUNT (DISTINCT ...) .

  • GROUP_CONCAT (expr)

Esta función devuelve una cadena resultado con los no concatenados NULL los valores de un grupo. DevuelveNULL si no hay no- NULL valores. La sintaxis completa es la siguiente:
SELECT FIRST_NAME,
GROUP_CONCAT(FIRST_NAME)
FROM EMPLOYEES
GROUP BY FIRST_NAME;
  • MAX ([DISTINCT]expr)

Devuelve el valor máximo de expr . MAX () puede tomar un argumento de cadena, en cuyo caso, se devuelve el valor máximo de la cadena. Consulte Sección 8.5.3, "Cómo utiliza MySQL los índices" . El DISTINCT palabra clave se puede utilizar para encontrar el máximo de los valores distintos de expr , sin embargo, esto produce el mismo resultado que omitiendo DISTINCT .

MAX () devuelve NULL si no hay filas coincidentes.

SELECT DEPARTMENT_ID, MIN(SALARY),MAX(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;

Para MAX () , MySQL actualmente compara ENUM y SET columnas por su valor de cadena en lugar de por la posición relativa de la cadena en el conjunto. Esto difiere de cómo ORDER BY las compara. Se espera que esto se rectifique en una futura versión de MySQL.

  • MIN ([DISTINCT]expr)

Devuelve el valor mínimo de expr . MIN () puede tomar un argumento de cadena, en cuyo caso, se devuelve el valor mínimo de cuerdas. Consulte Sección 8.5.3, "Cómo utiliza MySQL los índices" . El DISTINCT palabra clave se puede utilizar para encontrar el mínimo de los valores distintos de expr , sin embargo, esto produce el mismo resultado que omitiendo DISTINCT .

MIN () devuelve NULL si no hay filas coincidentes.

SELECT DEPARTMENT_ID, MIN(SALARY),MAX(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;

Para MIN () , MySQL actualmente compara ENUM y SET columnas por su valor de cadena en lugar de por la posición relativa de la cadena en el conjunto. Esto difiere de cómo ORDER BY las compara. Se espera que esto se rectifique en una futura versión de MySQL.

  • SUM ([DISTINCT]expr)

Devuelve la suma de expr . Si el juego de vuelta no tiene filas, SUM () devuelve NULL . El DISTINCT palabra clave puede utilizarse para sumar sólo los valores distintos de expr .

SUM () devuelve NULL si no hay filas coincidentes.
SELECT DEPARTMENT_ID, SUM(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;

Modificadores de Group By:


ROLLUP/ WITH ROLLUP


La cláusula GROUP BY permite añadir un modificador WITH ROLLUP que provoca añadir registros extra al resumen de la salida. Estos registros representan operaciones de resumen de alto nivel ( o super agregadas ). ROLLUP por lo tanto le permite responder preguntas en múltiples niveles de análisis con una sola consulta.
SELECT FIRST_NAME, SUM(MANAGER_ID)
FROM EMPLOYEES
GROUP BY FIRST_NAME
WITH ROLLUP;

La línea super agregada con la suma total se identifica con el valor NULL en la columna Country_name .
ROLLUP tiene un efecto más complejo cuando hay múltiples columnas GROUP BY . En este caso, cada vez que hay un “break” (cambio en el valor) en cualquiera excepto la última columna de agrupación, la consulta produce registros super agregados extra.
Por ejemplo, sin ROLLUP, un resumen de la tabla COUNTRIES basado en Country_name y Region_id puede tener este aspecto:
SELECT DISTINCT COUNTRY_NAME,SUM(REGION_ID)
FROM COUNTRIES
GROUP BY COUNTRY_NAME,REGION_ID;
La salida indica valores resumen sólo en el nivel de análisis year/country/product . Cuando se añade ROLLUP , la consulta produce registros extra:
SELECT DISTINCT COUNTRY_NAME,SUM(REGION_ID)
FROM COUNTRIES
GROUP BY COUNTRY_NAME,REGION_ID
WITH ROLLUP;

Otras consideraciones usando ROLLUP

Los siguientes puntos listan algunos comportamientos específicos a la implementación de MySQL de ROLLUP:

Cuando usa ROLLUP, no puede usar una cláusula ORDER BY para ordenar los resultados. En otras palabras,ROLLUP y ORDER BY son mútuamente exclusivas. Sin embargo, puede tener algún control sobre la ordenación.GROUP BY en MySQL ordena los resultados, y puede usar explícitamente ASC y DESC con columnas mostradas en la lista GROUP BY para especificar orden de ordenación para columnas individuales. (Los registros resumen de alto nivel apadidos por ROLLUP todavía aparecen tras los registros para los que son calculados, a pesar del orden de ordenación.)

LIMIT puede usarse para restringir el número de registros retornados al cliente. LIMIT se aplica tras ROLLUP, así que el límite se aplica contra los registros extra añadidos por ROLLUP. Por ejemplo:
SELECT DISTINCT COUNTRY_NAME,SUM(REGION_ID)
FROM COUNTRIES
GROUP BY COUNTRY_NAME,REGION_ID
WITH ROLLUP
LIMIT 25;
Usar LIMIT con ROLLUP puede producir resultados que son más difíciles de interpretar, ya que tiene menos contexto para entender los registros super agregados.
Los indicadores NULL en cada registro super agregado se preducen cuando los registros se envían al cliente. El servidor busca las columnas llamadas en la cláusula GROUP BY siguiendo la que esté más a la izquierda que ha cambiado un valor. Para cualquier columna en el conjunto de resultados con un nombre que sea una coincidencia léxica para cualquiera de estos nombres, su valor se cambia a NULL. (Si especifica columnas para agrupar con número de columna, el servidor identifica tales columnas para cambiar a NULL por el número.)
Debido a que los valores NULL en los registros super agregados se guardan en el conjunto de resultados en una de las últimas etapas del proceso de la consulta, no puede testearlas como valores NULL dentro de la propia consulta.