«SELECT TOP 3 клиентов и их общее количество заказов, отсортированных по дате заказа»
Для того, чтобы получить TOP 3
клиентов в зависимости от их количества заказов, в первую очередь необходимо "ORDER BY num_orders DESC"
. Включите customer_id
в ORDER BY
в качестве тай-брейкера в случае, если несколько клиентов имеют счетчик 3-го высшего порядка.
SELECT TOP 3
sub.customer_id,
sub.num_orders,
sub.last_order_date
FROM
(
SELECT
c.customer_id,
Count(o.order_id) AS num_orders,
Max(o.order_date) AS last_order_date
FROM
Customers AS c
LEFT JOIN Orders AS o
ON c.customer_id = o.cust_id
WHERE o.order_date > Date() - 30
GROUP BY c.customer_id
) AS sub
ORDER BY 2 DESC, 1;
Это должно дать вам 3 главных клиентов. Если вы хотите, чтобы их отсортировали по last_order_date
, используйте этот sql в подзапросе и примените ORDER BY last_order_date
к набору результатов подзапроса.
На ваш комментарий, 3 лучших клиента означают 3, которые разместили заказы совсем недавно. Это на самом деле простой запрос, потому что вам нужен только один ORDER BY
как для TOP 3
, так и для окончательного порядка сортировки. Измените ORDER BY
в запросе выше ...
ORDER BY 3 DESC, 1;
Если num_orders
должно быть количество заказов клиентов, размещенных с начала времени --- то есть не только те заказы, размещенные в течение последних 30 дней --- сохранить этот запрос как Query1:
SELECT TOP 3
sub.cust_id,
sub.last_order_date
FROM
(
FROM Orders AS o
WHERE o.order_date > Date() - 30
GROUP BY o.cust_id
) AS sub
ORDER BY 2 DESC, 1;
Затем сохраните этот запрос как Query2:
SELECT
o.cust_id,
Count(o.order_id) AS num_orders
FROM Orders AS o
GROUP BY o.cust_id;
Finall y создайте третий запрос, который внутренний соединяет Query1 с Query2: Query1 дает вам последние 3 клиента и дату их последнего заказа; Query2 дает вам общее количество всех заказов, размещенных каждым клиентом; INNER JOIN
фильтрует строки, возвращенные с Query2 только тем клиентам, которые присутствуют в Query1.
По [new sqlfiddle] (http://sqlfiddle.com/#!3/0e7223/27/0) это не дает ожидаемого результата – Nelluk
Извините, забыли приложить строку даты в одинарных кавычках. Все еще не работает должным образом. Пример [скрипка] (http://sqlfiddle.com/#!3/0e7223/41) учитывает только заказы, размещенные с данной даты, а не общие заказы – Nelluk
@Nelluk См. Мое редактирование. – William