Problema:
Você deseja agrupar seus dados por duas colunas para poder contar algumas estatísticas.
Exemplo:
Na
order
tabela, você tem as colunas order_date
, product_id
, customer_id
e number
. Você gostaria de contar o número de produtos comprados por cada cliente a cada dia. O
order
tabela fica assim:order_date | product_id | customer_id | número |
---|---|---|---|
2020-11-25 | 7 | 1 | 1 |
2020-11-25 | 12 | 1 | 3 |
2020-11-26 | 53 | 1 | 2 |
2020-11-26 | 1 | 2 | 4 |
2020-11-26 | 3 | 2 | 1 |
2020-11-26 | 16 | 2 | 7 |
2020-11-26 | 3 | 3 | 2 |
2020-11-27 | 6 | 3 | 1 |
Solução:
SELECT order_date, customer_id, SUM(number) AS products_number FROM order
O resultado é:
order_date | customer_id | products_number |
---|---|---|
26/11/2020 | 3 | 2 |
2020-11-27 | 3 | 1 |
2020-11-26 | 2 | 12 |
2020-11-25 | 1 | 4 |
2020-11-26 | 1 | 2 |
Discussão:
Para agrupar por duas colunas, basta usar
GROUP BY
com duas colunas. Os nomes das colunas devem ser listados após o GROUP BY
palavra-chave e separados por vírgula. Os grupos serão criados com base nos valores de ambas as colunas; para cada par de valores, um grupo separado é criado (por exemplo, ('2020-11-25', 1)
). Observe a tabela abaixo, onde cada grupo é apresentado em uma cor diferente:order_date | customer_id | product_id | número |
---|---|---|---|
2020-11-25 | 1 | 7 | 1 |
2020-11-25 | 1 | 12 | 3 |
2020-11-26 | 1 | 53 | 2 |
26/11/2020 | 2 | 1 | 4 |
26/11/2020 | 2 | 3 | 1 |
26/11/2020 | 2 | 16 | 7 |
2020-11-26 | 3 | 3 | 2 |
2020-11-27 | 3 | 6 | 1 |
Se uma ou ambas as colunas tiverem
NULL
valores, esses valores são tratados como um grupo separado (por exemplo, ('2020-11-26', NULL)
, (NULL, 5)
ou (NULL, NULL)
). Por outro lado, se houver
NULLs
em uma coluna na qual aplicamos uma função agregada, o NULL
os valores são simplesmente omitidos. (Neste exemplo, a função agregada é SUM()
e a coluna é number
). Se tivéssemos os valores numéricos 2 , 1 e NULL para um dos grupos, o SUM(number)
seria igual a 3
(2
e 1
são adicionados juntos, e NULL
é omitido.) Da mesma forma, você pode agrupar por qualquer número de colunas - basta escrever os nomes das colunas no
GROUP BY
cláusula e separe-os com vírgulas.