sql >> Base de Datos >  >> RDS >> Database

Cómo agrupar por dos columnas en SQL

Problema:

Desea agrupar sus datos en dos columnas para poder contar algunas estadísticas.

Ejemplo:

En el order tabla, tienes las columnas order_date , product_id , customer_id y number . Le gustaría contar la cantidad de productos comprados por cada cliente cada día.

El order la tabla se ve así:

fecha_pedido id_producto id_cliente 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

Solución:

SELECT
  order_date,
  customer_id,
  SUM(number) AS products_number
FROM order

El resultado es:

fecha_pedido id_cliente número_productos
2020-11-26 3 2
2020-11-27 3 1
2020-11-26 2 12
2020-11-25 1 4
2020-11-26 1 2

Discusión:

Para agrupar por dos columnas, simplemente use GROUP BY con dos columnas. Los nombres de las columnas deben aparecer después de GROUP BY palabra clave y separados por una coma. Los grupos se crearán en función de los valores de ambas columnas; para cada par de valores, se crea un grupo separado (por ejemplo, ('2020-11-25', 1) ). Mire la tabla a continuación, donde cada grupo se presenta en un color diferente:

fecha_pedido id_cliente id_producto número
2020-11-25 1 7 1
2020-11-25 1 12 3
2020-11-26 1 53 2
2020-11-26 2 1 4
2020-11-26 2 3 1
2020-11-26 2 16 7
2020-11-26 3 3 2
2020-11-27 3 6 1

Si una o ambas columnas tienen NULL valores, estos valores se tratan como un grupo separado (por ejemplo, ('2020-11-26', NULL) , (NULL, 5) o (NULL, NULL) ).

Por otro lado, si hay NULLs en una columna en la que aplicamos una función agregada, el NULL simplemente se omiten los valores. (En este ejemplo, la función agregada es SUM() y la columna es number ). Si tuviéramos los valores numéricos 2 , 1 y NULO para uno de los grupos, el SUM(number) sería igual a 3 (2 y 1 se suman y NULL se omite.)

Del mismo modo, puede agrupar por cualquier número de columnas; simplemente escriba los nombres de las columnas en GROUP BY cláusula y sepárelas con comas.