Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Entendendo as funções GROUPING e GROUPING_ID no SQL Server


Os operadores ROLLUP e CUBE são usados ​​para retornar resultados agregados pelas colunas na cláusula GROUP BY.

As funções GROUPING e GROUPING_ID são usadas para identificar se as colunas na lista GROUP BY são agregadas (usando os operadores ROLLUP ou CUBE) ou não.

Existem duas diferenças principais entre as funções GROUPING e GROUPING_ID.

Eles são os seguintes:
  • A função GROUPING é aplicável em uma única coluna, enquanto a lista de colunas da função GROUPING_ID precisa corresponder à lista de colunas na cláusula GROUP BY.
  • A função GROUPING indica se uma coluna na lista GROUP BY é agregada ou não. Retorna 1 se o conjunto de resultados for agregado e 0 se o conjunto de resultados não for agregado.

Por outro lado, a função GROUPING_ID também retorna um inteiro. No entanto, ele realiza a conversão de binário para decimal depois de concatenar o resultado de todas as funções GROUPING.

Neste artigo, veremos as funções GROUPING e GROUPING_ID em ação com a ajuda de exemplos.

Preparando alguns dados fictícios

Como sempre, vamos criar alguns dados fictícios que usaremos para o exemplo com o qual trabalharemos neste artigo.

Execute o seguinte 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')


No script acima, criamos um banco de dados chamado “Empresa”. Criamos então uma tabela “Employee” dentro do banco de dados da Empresa. Por fim, inserimos alguns registros fictícios na tabela Employee.

Função AGRUPAMENTO

Conforme mencionado acima, a função GROUPING retorna 1 se o conjunto de resultados for agregado e 0 se o conjunto de resultados não for agregado.

Dê uma olhada no script a seguir para ver a função GROUPING em ação.
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)

O script acima conta a soma dos salários de todos os funcionários e funcionárias, que são agrupados primeiro pela coluna Departamento e depois pela coluna Gênero. Mais duas colunas são adicionadas para exibir o resultado da função GROUPING aplicada às colunas Departamento e Gênero.

O operador ROLLUP é usado para exibir a soma dos salários na forma de totais gerais e subtotais.

A saída do script acima se parece com isso.



Observe atentamente a saída. A soma dos salários é exibida por gênero por departamento (linhas 1, 2, 4, 5, 7, 9, 10 e 12). Em seguida, também é agregado apenas por gênero (linhas 3, 6, 8, 11 e 13). Por fim, o total geral de salários agregados por Departamento e Gênero é exibido na linha 14.

1 é exibido na coluna da função GROUPING GP_Gender para linhas onde os resultados são agregados por gênero, ou seja, linhas 3, 6, 8, 11 e 13. Isso ocorre porque a coluna GP_Gender contém o resultado da função GROUPING aplicada à coluna Gender.

Da mesma forma, a linha 14 contém a soma agregada de todos os departamentos e todas as colunas. Portanto, 1 é retornado para as colunas GP_Department e GP_Gender.

Você pode ver que NULL é exibido nas colunas Departamento e Gênero na saída onde os resultados são agregados. Por exemplo, na linha 3, NULL é exibido na coluna Gênero porque os resultados são agregados por coluna de gênero e, portanto, não há valor de coluna a ser exibido. Não queremos que nossos usuários vejam NULL, uma palavra melhor aqui poderia ser "Todos os gêneros".

Para fazer isso, temos que modificar nosso script da seguinte forma:
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)

No script acima, se a função AGRUPAMENTO aplicada à coluna Departamento retornar 1 e “Todos os Departamentos” for exibido na coluna Departamento. Caso contrário, se a coluna Departamento contiver o valor NULL, exibirá “Desconhecido”. A coluna de gênero foi modificada da mesma forma.

A execução do script acima retorna os seguintes resultados:



Você pode ver que NULL nas colunas Department e Gender onde a função GROUPING retorna 1, foi substituído por “All Departments” e “All Genders”, respectivamente.

Função GROUPING_ID

A função GROUPING_ID concatena a saída das funções GROUPING aplicadas a todas as colunas especificadas na cláusula GROUP BY. Em seguida, ele executa a conversão de binário para decimal antes de retornar a saída final.

Vamos primeiro concatenar a saída retornada pela função GROUPING aplicada às colunas Department e Gender. Dê uma olhada no script a seguir:
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)

Na saída, você verá 0s e 1s retornados pela função GROUPING concatenados juntos. A saída fica assim:



A função GROUPING_ID simplesmente retorna o equivalente decimal do valor binário formado como resultado da concatenação dos valores retornados pelas funções GROUPING.

Execute o seguinte script para ver a função GROUPING ID em ação:
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 a linha 1, a função GROUPING ID retornará 0, pois o equivalente decimal de '00' é zero.

Para as linhas 3, 6, 8, 11 e 13, a função GROUPING_ID retorna 1, pois o equivalente decimal de '01' é 1.

Finalmente, para a linha 14, a função GROUPIND_ID retorna 3, pois o equivalente binário de ‘11’ é 3.

A saída do script acima é assim:



Veja também:

Microsoft:Visão geral do Grouping_ID

Microsoft:Visão geral do agrupamento

YouTube:Agrupamento e Grouping_ID