Resumo: neste tutorial, você aprenderá sobre o conceito de conjuntos de agrupamento e como usar a cláusula do PostgreSQL GROUPING SETS para gerar múltiplos conjuntos de agrupamento em uma consulta.
Configurar uma tabela de exemplo
Deixamos começar criando uma nova tabela chamadasales para a demonstração.
Code language: SQL (Structured Query Language) (sql)

A tabela sales armazena o número de produtos vendidos por marca e segmento.
Introdução ao conjunto de agrupamentos do PostgreSQL
Um conjunto de agrupamentos é um conjunto de colunas pelo qual você agrupa usando a cláusula GROUP BY.
Um conjunto de agrupamentos é denotado por uma lista separada por vírgula de colunas colocadas entre parênteses:
Por exemplo, a consulta seguinte usa a cláusula GROUP BY para retornar o número de produtos vendidos por marca e segmento. Em outras palavras, define um conjunto de agrupamento da marca e segmento que é denotado por (brand, segement)
Code language: SQL (Structured Query Language) (sql)

A consulta seguinte encontra o número de produtos vendidos por uma marca. Define um conjunto de agrupamentos (brand):
Code language: SQL (Structured Query Language) (sql)

A consulta seguinte encontra o número de produtos vendidos por segmento. Define um conjunto de agrupamentos (segment):
Code language: SQL (Structured Query Language) (sql)

A consulta seguinte encontra o número de produtos vendidos para todas as marcas e segmentos. Ela define um conjunto de agrupamento vazio que é indicado por ().
Code language: SQL (Structured Query Language) (sql)

Se você quiser todos os conjuntos de agrupamento usando uma única consulta. Para conseguir isso, você pode usar o UNION ALL para combinar todas as consultas acima.
Porque UNION ALL requer que todos os conjuntos de resultados tenham o mesmo número de colunas com tipos de dados compatíveis, você precisa ajustar as consultas adicionando NULL à lista de seleção de cada uma como mostrado abaixo:
Code language: SQL (Structured Query Language) (sql)

Esta consulta gerou um único conjunto de resultados com os agregados para todos os conjuntos de agrupamento.
Even embora a consulta acima funcione como você esperava, ela tem dois problemas principais.
- Primeiro, ela é bastante longa.
- Segundo, ela tem um problema de performance porque o PostgreSQL tem que digitalizar a tabela
salesseparadamente para cada consulta.
Para torná-lo mais eficiente, o PostgreSQL fornece a cláusula GROUPING SETS que é a subcláusula da GROUP BY cláusula.
A GROUPING SETS permite que você defina múltiplos conjuntos de agrupamento na mesma consulta.
A sintaxe geral do GROUPING SETS é a seguinte:
Code language: SQL (Structured Query Language) (sql)
Nesta sintaxe, nós temos quatro conjuntos de agrupamento (c1,c2), (c1), (c2), e ().
Para aplicar esta sintaxe ao exemplo acima, você pode usar a cláusula GROUPING SETS em vez da cláusula UNION ALL como esta:
Code language: SQL (Structured Query Language) (sql)

Esta consulta é muito mais curta e mais legível. Além disso, o PostgreSQL otimizará o número de vezes que ele escaneia a tabela sales e não escaneia múltiplas vezes.
Função de agrupamento
A função GROUPING() aceita um argumento que pode ser um nome de coluna ou uma expressão:
A cláusula column_name ou expression deve combinar com a especificada na cláusula GROUP BY.
A função GROUPING() retorna o bit 0 se o argumento for um membro do conjunto de agrupamento atual e 1 caso contrário.
Veja o seguinte exemplo:
Code language: SQL (Structured Query Language) (sql)

Como mostrado na captura de tela, quando o valor no grouping_brand é 0, a coluna sum mostra o subtotal do brand.
Quando o valor no grouping_segment é zero, a coluna de soma mostra o subtotal do segment.
Você pode usar a função GROUPING() na cláusula HAVING para encontrar o subtotal de cada marca assim:

Neste tutorial, você aprendeu como usar o PostgreSQL GROUPING SETS para gerar múltiplos conjuntos de agrupamentos.
- Este tutorial foi útil ?
- Sim Não