2013-05-30 8 views
2

У меня есть таблицы КЛИЕНТОВ И ЗАКАЗОВ, связанные с customer_id. Я просто хочу получить количество заказов, которые были размещены каждым клиентом. Мне удался этот пример sqlfiddle .Количество связанных записей, но ограничить результаты

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

Я пробовал один подход с этим other SQL fiddle. Я пытаюсь ВЫБРАТЬ ТОП-3 клиентов и их общее количество заказов, отсортированных по дате их заказа. Это не работает и отображает только количество заказов, размещенных каждым клиентом в течение этого урезанного периода времени.

ответ

1

Я думаю, вы немного смущены своим SELECT TOP (3) и ORDER BY.

Пойдите с вашим первоначальным запросом с дополнительным предложением WHERE;

SELECT customer_id, COUNT(order_id) AS num_orders 
FROM Customers 
LEFT JOIN Orders ON (customer_id = cust_id) 
WHERE order_date > DATE() - 30 // or desired equivalent 
GROUP BY customer_id; 

Редактировать

В соответствии с Вашим последним комментарием ...

SELECT customer_id, COUNT(order_id) AS num_orders 
FROM Customers 
LEFT JOIN Orders ON (customer_id = cust_id) 
WHERE customer_id IN(SELECT TOP (3) [cust_id] FROM Orders ORDER BY [order_date] DESC) 
GROUP BY customer_id 

SQL Fiddle

Это будет выбирать идентификаторы самых последних трех заказов и вернуть общее количество заказов для каждого ассоциированного клиента.

+0

По [new sqlfiddle] (http://sqlfiddle.com/#!3/0e7223/27/0) это не дает ожидаемого результата – Nelluk

+0

Извините, забыли приложить строку даты в одинарных кавычках. Все еще не работает должным образом. Пример [скрипка] (http://sqlfiddle.com/#!3/0e7223/41) учитывает только заказы, размещенные с данной даты, а не общие заказы – Nelluk

+0

@Nelluk См. Мое редактирование. – William

1

«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.

+0

Извините за путаницу - я не ищу трех лучших клиентов по количеству заказов, которые они разместили. Я ищу трех лучших клиентов, основанных на недавнем заказе и общем количестве заказов, которые разместили эти клиенты. – Nelluk

+0

См. [Пример использования] (http://sqlfiddle.com/#!3/0e7223/44) измененного запроса. Он показывает только «1» для customer_id = 1, когда я получаю их общее количество заказов. – Nelluk

+0

Означает ли это, что вы хотите выбрать тех клиентов, которые разместили заказы в течение последних 30 дней, но забирают количество своих заказов на все время --- не только те заказы, которые они разместили за последние 30 дней? – HansUp

Смежные вопросы