Hemos dicho que los resúmenes se calculan sobre todas las filas del origen después de haber ejecutado el WHERE, pues ALL permite obtener un resumen de las filas que no cumplen el WHERE.
ALL Incluye todos los grupos y conjuntos de resultados, incluso aquellos en los que no hay filas que cumplan la condición de búsqueda especificada en la cláusula WHERE. Cuando se especifica ALL, se devuelven valores NULL para las columnas de resumen de los grupos que no cumplen la condición de búsqueda. No se puede especificar ALL con los operadores CUBE y ROLLUP.
GROUP BY ALL no se admite en consultas que tienen acceso a tablas remotas si también hay una cláusula WHERE en la consulta.
Por ejemplo, vamos a modificar la consulta anterior:
SELECT rep, clie, count(numpedido) AS [Número de pedidos], MAX(importe) AS [Importe máximo] FROM pedidos WHERE YEAR(fechapedido) = 1997 GROUP BY ALL rep, clie ORDER BY rep, clie;
Resultado:
| rep | clie | Número de pedidos |
Importe máximo |
|---|---|---|---|
| 101 | 2102 | 0 | NULL |
| 101 | 2108 | 0 | NULL |
| 101 | 2113 | 1 | 225,00 |
| 102 | 2106 | 2 | 21,30 |
| 102 | 2120 | 1 | 37,50 |
| 103 | 2111 | 2 | 21,00 |
| 105 | 2103 | 4 | 275,00 |
| 105 | 2111 | 1 | 37,45 |
| 106 | 2101 | 1 | 14,58 |
| 106 | 2117 | 0 | NULL |
| 107 | 2109 | 1 | 313,50 |
| 107 | 2124 | 2 | 24,30 |
| 108 | 2112 | 1 | 29,25 |
| 108 | 2114 | 1 | 71,00 |
| 108 | 2118 | 3 | 14,20 |
Cuál ha sido el efecto de añadir ALL? Se han añadido filas para las filas del origen que no cumplen la condición del WHERE pero sin que intervengan en el cálculo de las funciones de agregado.
Por ejemplo el representante 101 tiene pedidos con el cliente 2102 pero estos pedidos no son del año 1997, por eso aparece la primera fila (no estaba en el resultado de la otra consulta) pero con 0 y NULL como resultados de las funciones de agregado.
ROLLUP especifica que, además de las filas que normalmente proporciona GROUP BY, se incluyen filas de resumen en el conjunto de resultados. Los grupos se resumen en un orden jerárquico, desde el nivel inferior del grupo hasta el superior. La jerarquía del grupo se determina por el orden en que se especifican las columnas de agrupamiento. Cambiar el orden de las columnas de agrupamiento puede afectar al número de filas generadas en el conjunto de resultados.
Por ejemplo:
SELECT rep, clie, count(numpedido) AS [Número de pedidos], MAX(importe) AS [Importe máximo] FROM pedidos WHERE YEAR(fechapedido) = 1997 GROUP BY rep, clie WITH ROLLUP;
Resultado:
| rep | clie | Número de pedidos |
Importe máximo |
|---|---|---|---|
| 101 | 2113 | 1 | 225,00 |
| 101 | NULL | 1 | 225,00 |
| 102 | 2106 | 1 | 21,30 |
| 102 | 2120 | 1 | 37,50 |
| 102 | NULL | 3 | 37,50 |
| 103 | 2111 | 2 | 21,00 |
| 103 | NULL | 2 | 21,00 |
| 105 | 2103 | 4 | 275,00 |
| 105 | 2111 | 1 | 37,45 |
| 105 | NULL | 5 | 275,00 |
| 106 | 2101 | 1 | 14,28 |
| 106 | NULL | 1 | 14,28 |
| 107 | 2109 | 1 | 313,50 |
| 107 | 2124 | 2 | 24,30 |
| 107 | NULL | 3 | 313,50 |
| 108 | 2112 | 1 | 29,25 |
| 108 | 2114 | 1 | 71,00 |
| 108 | 2118 | 3 | 14,20 |
| 108 | NULL | 5 | 71,00 |
| ... | ... | ... | ... |
| NULL | NULL | 23 | 450,00 |
Efecto: Se han añadido automáticamente subtotales por cada nivel de agrupamiento y una línea de totales generales al final. En este caso no hemos incluido ORDER BY porque las filas salen ya ordenadas.
Síguenos en: Facebook Sobre aulaClic Política de Cookies
© aulaClic. Todos los derechos reservados. Prohibida la reproducción por cualquier medio.