Как суммировать стоимость покупки от каждого типа клиентов каждый месяц?

#mysql #sql

Вопрос:

У меня есть два столика.

Клиенты

идентификатор пользователя customer_type
1 Студенты
2 Синий

Заказы

идентификатор заказа идентификатор пользователя значение покупки Дата
001 1 500 2021-06-03
002 2 600 2021-03-01

Я хочу сделать запрос, чтобы показать ежемесячную общую сумму покупок от каждого типа клиентов, которая, как ожидается, будет такой:

месяц Студенты Синий
3 0 600
6 500 0

Я пытался использовать такой подзапрос:

 SELECT 
month(order_date) as month, 
(SELECT sum(order_value)  from orders JOIN customers
    ON customers.customer_id = orders.customer_id
    WHERE customers.customer_type LIKE 'Business'
    GROUP BY month, customers.customer_type) as personal
from orders
JOIN customers
ON customers.customer_id = orders.customer_id
 

Но все равно не получается, я хочу попробовать использовать подзапрос внутри JOIN , но немного запутываюсь. У вас есть какое-нибудь решение этой проблемы?

Ответ №1:

Используйте условную агрегацию:

 SELECT MONTH(o.order_date) as month, 
       SUM(CASE WHEN c.customer_type = 'student' THEN order_value END) as student,
       SUM(CASE WHEN c.customer_type = 'blue' THEN order_value END) as blue
FROM orders o JOIN
     customers c
     ON c.customer_id = o.customer_id
GROUP BY MONTH(o.order_date);
 

Подзапрос не нужен. Обратите внимание, что использование month() без учета года часто приводит к неверным результатам.

Комментарии:

1. Спасибо, я никогда не знал, как им пользоваться SUM CASE , но теперь я знаю.