Buscar..


Introducción

Los resultados de una consulta SELECT pueden agruparse por una o más columnas usando la instrucción GROUP BY : todos los resultados con el mismo valor en las columnas agrupadas se agregan juntos. Esto genera una tabla de resultados parciales, en lugar de un resultado. GROUP BY se puede usar junto con las funciones de agregación que usan la instrucción HAVING para definir cómo se agregan las columnas no agrupadas.

Sintaxis

  • AGRUPAR POR {
    expresión de columna
    | ROLLUP (<group_by_expression> [, ... n])
    | CUBO (<group_by_expression> [, ... n])
    | CONJUNTOS DE AGRUPACIÓN ([, ... n])
    | () - calcula el total general
    } [, ... n]

  • <group_by_expression> :: =
    expresión de columna
    | (columna-expresión [, ... n])

  • <grouping_set> :: =
    () - calcula el total general
    | <grouping_set_item>
    | (<grouping_set_item> [, ... n])

  • <grouping_set_item> :: =
    <group_by_expression>
    | ROLLUP (<group_by_expression> [, ... n])
    | CUBO (<group_by_expression> [, ... n])

USE GROUP BY para CONTAR el número de filas para cada entrada única en una columna dada

Supongamos que desea generar recuentos o subtotales para un valor determinado en una columna.

Dada esta tabla, "westerosianos":

Nombre GreatHouseAllegience
Arya Rígido
Cercei Lannister
Myrcella Lannister
Yara Greyjoy
Catelyn Rígido
Sansa Rígido

Sin GROUP BY, COUNT simplemente devolverá un número total de filas:

SELECT Count(*) Number_of_Westerosians
FROM Westerosians

devoluciones...

Número_de_Westerosianos
6

Pero al agregar GRUPO POR, podemos CONTAR a los usuarios para cada valor en una columna dada, para devolver el número de personas en una Gran Casa dada, por ejemplo:

SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians
FROM Westerosians
GROUP BY GreatHouseAllegience

devoluciones...

Casa Número_de_Westerosianos
Rígido 3
Greyjoy 1
Lannister 2

Es común combinar GROUP BY con ORDER BY para ordenar los resultados por categoría más grande o más pequeña:

SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians
FROM Westerosians
GROUP BY GreatHouseAllegience
ORDER BY Number_of_Westerosians Desc

devoluciones...

Casa Número_de_Westerosianos
Rígido 3
Lannister 2
Greyjoy 1

Filtrar los resultados de GROUP BY utilizando una cláusula HAVING.

Una cláusula HAVING filtra los resultados de una expresión GROUP BY. Nota: Los siguientes ejemplos utilizan la base de datos de ejemplo de la Biblioteca .

Ejemplos:

Devuelve todos los autores que escribieron más de un libro ( ejemplo en vivo ).

SELECT
  a.Id,
  a.Name,
  COUNT(*) BooksWritten
FROM BooksAuthors ba
  INNER JOIN Authors a ON a.id = ba.authorid
GROUP BY
  a.Id,
  a.Name
HAVING COUNT(*) > 1    -- equals to HAVING BooksWritten > 1
;

Devuelve todos los libros que tengan más de tres autores ( ejemplo vivo ).

SELECT
  b.Id,
  b.Title,
  COUNT(*) NumberOfAuthors
FROM BooksAuthors ba
  INNER JOIN Books b ON b.id = ba.bookid
GROUP BY
  b.Id,
  b.Title
HAVING COUNT(*) > 3    -- equals to HAVING NumberOfAuthors > 3
;

Ejemplo básico de GROUP BY

Podría ser más fácil si piensa en GROUP BY como "para cada uno" por el bien de la explicación. La consulta a continuación:

SELECT EmpID, SUM (MonthlySalary) 
FROM Employee
GROUP BY EmpID

esta diciendo:

"Dame la suma de MonthlySalary's para cada EmpID"

Así que si tu mesa se veía así:

+-----+-------------+
|EmpID|MonthlySalary|
+-----+-------------+
|1    |200          |
+-----+-------------+
|2    |300          |
+-----+-------------+

Resultado:

+-+---+
|1|200|
+-+---+
|2|300|
+-+---+

La suma no parece hacer nada porque la suma de un número es ese número. Por otro lado si se veía así:

+-----+-------------+
|EmpID|MonthlySalary|
+-----+-------------+
|1    |200          |
+-----+-------------+
|1    |300          |
+-----+-------------+
|2    |300          |
+-----+-------------+

Resultado:

+-+---+
|1|500|
+-+---+
|2|300|
+-+---+

Entonces sería porque hay dos EmpID 1 para sumar.

Agregación ROLAP (Data Mining)

Descripción

El estándar SQL proporciona dos operadores agregados adicionales. Estos utilizan el valor polimórfico "ALL" para denotar el conjunto de todos los valores que puede tomar un atributo. Los dos operadores son:

  • with data cube que proporciona todas las combinaciones posibles que los atributos de argumento de la cláusula.
  • with roll up que proporciona los agregados obtenidos al considerar los atributos en orden de izquierda a derecha en comparación con la forma en que se enumeran en el argumento de la cláusula.

Versiones estándar de SQL que admiten estas características: 1999, 200, 200, 200, 202011.

Ejemplos

Considere esta tabla:

Comida Marca Cantidad total
Pastas Marca1 100
Pastas Marca2 250
Pizza Marca2 300

Con cubo

select Food,Brand,Total_amount
from Table
group by Food,Brand,Total_amount with cube
Comida Marca Cantidad total
Pastas Marca1 100
Pastas Marca2 250
Pastas TODOS 350
Pizza Marca2 300
Pizza TODOS 300
TODOS Marca1 100
TODOS Marca2 550
TODOS TODOS 650

Con enrollar

select Food,Brand,Total_amount
from Table
group by Food,Brand,Total_amount with roll up
Comida Marca Cantidad total
Pastas Marca1 100
Pastas Marca2 250
Pizza Marca2 300
Pastas TODOS 350
Pizza TODOS 300
TODOS TODOS 650


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow