CUBE especifica que, además de las filas que normalmente proporciona GROUP BY, deben incluirse filas de resumen en el conjunto de resultados. Se devuelve una fila de resumen GROUP BY por cada posible combinación de grupo y subgrupo del conjunto de resultados. En el resultado se muestra una fila de resumen GROUP BY como NULL, pero se utiliza para indicar todos los valores.
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 CUBE;
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 |
NULL | 2101 | 1 | 14,58 |
NULL | 2103 | 4 | 275,00 |
NULL | 2106 | 2 | 21,30 |
NULL | 2107 | 1 | 6,32 |
NULL | 2108 | 1 | 56,25 |
NULL | 2109 | 1 | 313,50 |
NULL | 2111 | 3 | 37,45 |
NULL | 2112 | 2 | 450,00 |
NULL | 2113 | 1 | 225,00 |
NULL | 2114 | 1 | 71,00 |
NULL | 2118 | 3 | 14,20 |
NULL | 2120 | 1 | 37,50 |
NULL | 2124 | 2 | 24,30 |
Efecto: Obtenemos además de los resultados obtenidos con ROLLUP (los totales por cada representante), los totales por el otro criterio (los totales por cada cliente).
El número de filas de resumen del conjunto de resultados se determina mediante el número de columnas que contiene la cláusula GROUP BY. Cada operando (columna) de la cláusula GROUP BY se enlaza según el agrupamiento NULL y se aplica el agrupamiento al resto de los operandos (columnas). CUBE devuelve todas las combinaciones posibles de grupo y subgrupo.
Tanto si utilizamos CUBE como ROLLUP, nos será útil la función de agregado GROUPING.
Si cogemos por ejemplo la primera fila remarcada (101 NULL …) el valor NULL, no sabemos si se refiere a una fila de subtotal o a que el representante 101 ha realizado un pedido sin número de cliente. Para poder salvar este problema se utiliza la función de agregado GROUPING.
SELECT rep, clie, count(numpedido) AS [Número de pedidos], MAX(importe) AS [Importe máximo], GROUPING(clie) AS [Fila resumen] FROM pedidos WHERE YEAR(fechapedido) = 1997 GROUP BY rep, clie WITH ROLLUP;
rep | clie | Número de pedidos |
Importe máximo |
Fila Resumen |
---|---|---|---|---|
101 | 2113 | 1 | 225,00 | 0 |
101 | NULL | 1 | 225,00 | 1 |
102 | 2106 | 2 | 21,30 | 0 |
102 | 2120 | 1 | 37,50 | 0 |
102 | NULL | 3 | 37,50 | 1 |
103 | 2111 | 2 | 21,00 | 0 |
Las filas que corresponden a subtotales aparecen con un 1 y las normales con un cero.
Ahora que estamos más familiarizados con las columnas de agrupamiento debemos comentar una regla a no olvidar:
EN LA LISTA DE SELECCIÓN DE UNA CONSULTA DE RESUMEN UN NOMBRE DE COLUMNA NO PUEDE APARECER FUERA DE UNA FUNCIÓN DE AGREGADO SI NO ES UNA COLUMNA DE AGRUPACIÓN.
Para practicar puedes realizar este Ejercicio Agrupar filas con GROUP BY.
Síguenos en: Facebook Sobre aulaClic Política de Cookies
© aulaClic. Todos los derechos reservados. Prohibida la reproducción por cualquier medio.