Resumen: en este tutorial, aprenderá sobre el concepto de conjunto de agrupación y cómo utilizar la cláusula GROUPING SETS
de PostgreSQL para generar múltiples conjuntos de agrupación en una consulta.
Crear una tabla de ejemplo
Comencemos creando una nueva tabla llamadasales
para la demostración.
Code language: SQL (Structured Query Language) (sql)
La tabla sales
almacena el número de productos vendidos por marca y segmento.
Introducción a PostgreSQL CONJUNTOS DE AGRUPACIÓN
Un conjunto de agrupación es un conjunto de columnas por el que se agrupa utilizando la cláusula GROUP BY
.
Un conjunto de agrupación se denota mediante una lista de columnas separada por comas colocada dentro de paréntesis:
Por ejemplo, la siguiente consulta utiliza la cláusula GROUP BY
para devolver el número de productos vendidos por marca y segmento. En otras palabras, define un conjunto de agrupación de la marca y el segmento que se denota por (brand, segement)
Code language: SQL (Structured Query Language) (sql)
La siguiente consulta encuentra el número de productos vendidos por una marca. Define un conjunto de agrupación (brand)
:
Code language: SQL (Structured Query Language) (sql)
La siguiente consulta busca el número de productos vendidos por segmento. Define un conjunto de agrupación (segment)
:
Code language: SQL (Structured Query Language) (sql)
La siguiente consulta encuentra el número de productos vendidos para todas las marcas y segmentos. Define un conjunto de agrupación vacío que se indica con ()
.
Code language: SQL (Structured Query Language) (sql)
Supongamos que se desea obtener todos los conjuntos de agrupación mediante una única consulta. Para conseguirlo, puede utilizar el UNION ALL
para combinar todas las consultas anteriores.
Debido a que el UNION ALL
requiere que todos los conjuntos de resultados tengan el mismo número de columnas con tipos de datos compatibles, debe ajustar las consultas añadiendo NULL
a la lista de selección de cada una de ellas, como se muestra a continuación:
Code language: SQL (Structured Query Language) (sql)
Esta consulta generó un único conjunto de resultados con los agregados de todos los conjuntos de agrupación.
Aunque la consulta anterior funciona como se esperaba, tiene dos problemas principales.
- Primero, es bastante larga.
- Segundo, tiene un problema de rendimiento porque PostgreSQL tiene que escanear la tabla
sales
por separado para cada consulta.
Para hacerlo más eficiente, PostgreSQL proporciona la cláusula GROUPING SETS
que es la subcláusula de la cláusula GROUP BY
.
La GROUPING SETS
permite definir múltiples conjuntos de agrupación en la misma consulta.
La sintaxis general de la GROUPING SETS
es la siguiente:
Code language: SQL (Structured Query Language) (sql)
En esta sintaxis, tenemos cuatro conjuntos de agrupación (c1,c2)
, (c1)
, (c2)
y ()
.
Para aplicar esta sintaxis al ejemplo anterior, puede utilizar la cláusula GROUPING SETS
en lugar de la cláusula UNION ALL
así:
Code language: SQL (Structured Query Language) (sql)
Esta consulta es mucho más corta y legible. Además, PostgreSQL optimizará el número de veces que escanea la tabla sales
y no escaneará varias veces.
Función de agrupación
La función GROUPING()
acepta un argumento que puede ser un nombre de columna o una expresión:
El column_name
o expression
debe coincidir con el especificado en la cláusula GROUP BY
.
La función GROUPING()
devuelve el bit 0 si el argumento es un miembro del conjunto de agrupación actual y 1 en caso contrario.
Vea el siguiente ejemplo:
Code language: SQL (Structured Query Language) (sql)
Como se muestra en la captura de pantalla, cuando el valor en el grouping_brand
es 0, la columna sum
muestra el subtotal del brand
.
Cuando el valor en el grouping_segment
es cero, la columna de suma muestra el subtotal del segment
.
Puede utilizar la función GROUPING()
en la cláusula HAVING
para encontrar el subtotal de cada marca así:
En este tutorial, ha aprendido a utilizar el GROUPING SETS
de PostgreSQL para generar múltiples conjuntos de agrupación.
- ¿Ha sido útil este tutorial?
- SíNo