sql >> Base de Datos >  >> RDS >> Sqlserver

Comprender las funciones GROUPING y GROUPING_ID en SQL Server

Los operadores ROLLUP y CUBE se utilizan para devolver resultados agregados por las columnas en la cláusula GROUP BY.

Las funciones GROUPING y GROUPING_ID se usan para identificar si las columnas en la lista GROUP BY están agregadas (usando los operadores ROLLUP o CUBE) o no.

Hay dos diferencias principales entre las funciones GROUPING y GROUPING_ID.

Son los siguientes:

  • La función GROUPING es aplicable en una sola columna, mientras que la lista de columnas para la función GROUPING_ID tiene que coincidir con la lista de columnas en la cláusula GROUP BY.
  • La función GROUPING indica si una columna en la lista GROUP BY está agregada o no. Devuelve 1 si el conjunto de resultados se agrega y 0 si el conjunto de resultados no se agrega.

Por otro lado, la función GROUPING_ID también devuelve un número entero. Sin embargo, realiza la conversión de binario a decimal después de concatenar el resultado de todas las funciones de AGRUPACIÓN.

En este artículo, veremos las funciones GROUPING y GROUPING_ID en acción con la ayuda de ejemplos.

Preparación de algunos datos ficticios

Como siempre, vamos a crear algunos datos ficticios que usaremos para el ejemplo con el que trabajaremos en este artículo.

Ejecute el siguiente script:

CREATE Database company;

 USE company;

CREATE TABLE employee
(
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender VARCHAR(50) NOT NULL,
    salary INT NOT NULL,
    department VARCHAR(50) NOT NULL
 )

 INSERT INTO employee 

VALUES
(1, 'David', 'Male', 5000, 'Sales'),
(2, 'Jim', 'Female', 6000, 'HR'),
(3, 'Kate', 'Female', 7500, 'IT'),
(4, 'Will', 'Male', 6500, 'Marketing'),
(5, 'Shane', 'Female', 5500, 'Finance'),
(6, 'Shed', 'Male', 8000, 'Sales'),
(7, 'Vik', 'Male', 7200, 'HR'),
(8, 'Vince', 'Female', 6600, 'IT'),
(9, 'Jane', 'Female', 5400, 'Marketing'),
(10, 'Laura', 'Female', 6300, 'Finance'),
(11, 'Mac', 'Male', 5700, 'Sales'),
(12, 'Pat', 'Male', 7000, 'HR'),
(13, 'Julie', 'Female', 7100, 'IT'),
(14, 'Elice', 'Female', 6800,'Marketing'),
(15, 'Wayne', 'Male', 5000, 'Finance')

En el script anterior, hemos creado una base de datos llamada "Empresa". Entonces hemos creado una tabla "Empleado" dentro de la base de datos de la empresa. Finalmente, hemos insertado algunos registros ficticios en la tabla de empleados.

Función de AGRUPACIÓN

Como se mencionó anteriormente, la función GROUPING devuelve 1 si el conjunto de resultados se agrega y 0 si el conjunto de resultados no se agrega.

Eche un vistazo a la siguiente secuencia de comandos para ver la función GROUPING en acción.

SELECT  
department AS Department, 
gender AS Gender, 
sum(salary) as Salary_Sum,
GROUPING(department) as GP_Department,
GROUPING(gender) as GP_Gender
FROM employee
GROUP BY ROLLUP (department, gender)

La secuencia de comandos anterior cuenta la suma de los salarios de todos los empleados masculinos y femeninos, que se agrupan primero por la columna Departamento y luego por la columna Género. Se agregan dos columnas más para mostrar el resultado de la función AGRUPACIÓN aplicada a las columnas Departamento y Género.

El operador ROLLUP se utiliza para mostrar la suma de los salarios en forma de totales generales y subtotales.

El resultado de la secuencia de comandos anterior se ve así.

Tome una mirada cuidadosa a la salida. La suma de los salarios se muestra por sexo por departamento (filas 1, 2, 4, 5, 7, 9, 10 y 12). Luego también se agrega solo por género (filas 3, 6, 8, 11 y 13). Finalmente, el total general de salarios agregados por Departamento y Género se muestra en la fila 14.

1 se muestra en la columna de la función AGRUPACIÓN GP_Gender para las filas donde los resultados se agregan por género, es decir, las filas 3, 6, 8, 11 y 13. Esto se debe a que la columna GP_Gender contiene el resultado de la función AGRUPACIÓN aplicada a la columna Género.

De manera similar, la fila 14 contiene la suma agregada de todos los departamentos y todas las columnas. Por lo tanto, se devuelve 1 para las columnas GP_Department y GP_Gender.

Puede ver que se muestra NULL en las columnas Departamento y Género en la salida donde se agregan los resultados. Por ejemplo, en la fila 3, se muestra NULL en la columna Género porque los resultados se agregan por columna de género y, por lo tanto, no hay valor de columna para mostrar. No queremos que nuestros usuarios vean NULL, una mejor palabra aquí podría ser "Todos los géneros".

Para hacer esto, tenemos que modificar nuestro script de la siguiente manera:

SELECT  
	CASE WHEN GROUPING(department) = 1 THEN 'All Departments' ELSE ISNULL(department, 'Unknown') END as Department,
	CASE WHEN GROUPING(gender) = 1 THEN 'All Genders' ELSE ISNULL(gender, 'Unknown') END as Gender,
	sum(salary) as Salary_Sum
FROM employee
GROUP BY ROLLUP (department, gender)

En el script anterior, si la función AGRUPACIÓN aplicada a la columna Departamento devuelve 1 y se muestra "Todos los departamentos" en la columna Departamento. De lo contrario, si la columna Departamento contiene el valor NULL, se mostrará "Desconocido". La columna de género se ha modificado de la misma manera.

Ejecutar el script anterior arroja los siguientes resultados:

Puede ver que NULL en las columnas Departamento y Género, donde la función AGRUPACIÓN devuelve 1, se reemplazó con "Todos los departamentos" y "Todos los géneros", respectivamente.

Función GROUPING_ID

La función GROUPING_ID concatena la salida de las funciones GROUPING aplicadas a todas las columnas especificadas en la cláusula GROUP BY. Luego realiza una conversión de binario a decimal antes de devolver el resultado final.

Primero concatenemos el resultado devuelto por la función GROUPING aplicada a las columnas Departamento y Género. Echa un vistazo a la siguiente secuencia de comandos:

USE company
SELECT  
department AS Department, 
gender AS Gender, 
sum(salary) as Salary_Sum,
CAST(GROUPING(department) AS VARCHAR(1)) +
CAST(GROUPING(gender) AS VARCHAR (1))  as Grouping
FROM employee
GROUP BY ROLLUP (department, gender)

En la salida, verá 0 y 1 devueltos por la función GROUPING concatenados. La salida se ve así:

La función GROUPING_ID simplemente devuelve el equivalente decimal del valor binario formado como resultado de la concatenación de los valores devueltos por las funciones GROUPING.

Ejecute el siguiente script para ver la función ID DE GRUPO en acción:

USE company
SELECT  
department AS Department, 
gender AS Gender, 
sum(salary) as Salary_Sum,
CAST(GROUPING(department) AS VARCHAR(1)) +
CAST(GROUPING(gender) AS VARCHAR (1))  as Grouping,
GROUPING_ID(department, gender) as Grouping_Id
FROM employee
GROUP BY ROLLUP (department, gender)

Para la fila 1, la función ID DE AGRUPACIÓN devolverá 0 ya que el equivalente decimal de '00' es cero.

Para las filas 3, 6, 8, 11 y 13, la función GROUPING_ID devuelve 1 ya que el equivalente decimal de '01' es 1.

Finalmente, para la fila 14, la función GROUPIND_ID devuelve 3, ya que el equivalente binario de '11' es 3.

El resultado del script anterior se ve así:

Ver también:

Microsoft:descripción general de Grouping_ID

Microsoft:descripción general de la agrupación

YouTube:Agrupación y Grouping_ID