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 |