Cláusula GROUP BY
A cláusula GROUP BY identifica as colunas de agrupamento para a consulta. É usada para agrupar as linhas em uma tabela que têm os mesmos valores em todas as colunas listadas. A ordem em que as colunas são listadas não importa. O resultado é a combinação de cada conjunto de linhas com valores comuns em uma linha que representa todas as linhas do grupo. Use GROUP BY para eliminar a redundância na saída e calcular agregados que se aplicam aos grupos. As colunas de agrupamento devem ser declaradas quando a consulta computa agregadas com funções padrão como SUM, AVG e COUNT. Para obter mais informações, consulte Funções agregadas.
Sintaxe
[ GROUP BY expression [, ...] | ALL | aggregation_extension ]
em que aggregation_extension é uma das seguintes:
GROUPING SETS ( () | aggregation_extension [, ...] ) | ROLLUP ( expr [, ...] ) | CUBE ( expr [, ...] )
Parâmetros
- expressão
-
A lista de colunas ou de expressões deve corresponder à lista de expressões não agregadas na lista de seleção da consulta. Por exemplo, considere a seguinte consulta simples.
select listid, eventid, sum(pricepaid) as revenue, count(qtysold) as numtix from sales group by listid, eventid order by 3, 4, 2, 1 limit 5; listid | eventid | revenue | numtix -------+---------+---------+-------- 89397 | 47 | 20.00 | 1 106590 | 76 | 20.00 | 1 124683 | 393 | 20.00 | 1 103037 | 403 | 20.00 | 1 147685 | 429 | 20.00 | 1 (5 rows)
Nesta consulta, a lista de seleção consiste em duas expressões agregadas. A primeira usa a função SUM e a segunda usa a função COUNT. As duas colunas restantes, LISTID e EVENTID, devem ser declaradas como colunas de agrupamento.
As expressões na cláusula GROUP BY também podem fazer referência à lista de seleção usando números ordinais. O exemplo anterior poderia ser abreviado da seguinte forma.
select listid, eventid, sum(pricepaid) as revenue, count(qtysold) as numtix from sales group by 1,2 order by 3, 4, 2, 1 limit 5; listid | eventid | revenue | numtix -------+---------+---------+-------- 89397 | 47 | 20.00 | 1 106590 | 76 | 20.00 | 1 124683 | 393 | 20.00 | 1 103037 | 403 | 20.00 | 1 147685 | 429 | 20.00 | 1 (5 rows)
- ALL
-
ALL indica agrupar por todas as colunas especificadas na lista SELECT, exceto as agregadas. Por exemplo, pense na consulta a seguir, que agrupa por
col1
ecol2
sem precisar especificá-las individualmente na cláusula GROUP BY. A colunacol3
é o argumento da funçãoSUM
e, portanto, não está agrupada.SELECT col1, col2 sum(col3) FROM testtable GROUP BY ALL
Se você excluir uma coluna na lista SELECT, a cláusula GROUP BY ALL não agrupará os resultados com base nessa coluna específica.
SELECT * EXCLUDE col3 FROM testtable GROUP BY ALL
- aggregation_extension
-
Você pode usar as extensões de agregação GROUPING SETS, ROLLUP e CUBE para realizar o trabalho de várias operações GROUP BY em uma única instrução. Para obter mais informações sobre extensões de agregação e funções relacionadas, consulte Extensões de agregação.
Exemplos
Os exemplos a seguir usam a tabela SALES que contém as colunas: salesid, listid, sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission e saletime. Para ter mais informações sobre a tabela SALES, consulte Banco de dados de exemplo.
O exemplo de consulta a seguir agrupa por salesid
e listid
sem precisar especificá-las individualmente na cláusula GROUP BY. A coluna qtysold
é o argumento da função SUM
e, portanto, não está agrupada.
SELECT salesid, listid, sum(qtysold) FROM sales GROUP BY ALL;
salesid | listid | sum --------+---------+------ 33095 | 36572 | 2 88268 | 100813 | 4 110917 | 127048 | 1 ...
O exemplo de consulta a seguir exclui várias colunas na lista SELECT, então GROUP BY ALL agrupa somente salesid e listid.
SELECT * EXCLUDE sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission, saletime FROM sales GROUP BY ALL;
salesid | listid --------+--------- 33095 | 36572 88268 | 100813 110917 | 127048 ...