Database
 sql >> Base de Dados >  >> RDS >> Database

Como agrupar por duas colunas no SQL

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.