#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
, но теперь я знаю.