Я поручено следующее:SQL Server - Получить клиентов с п-го порядка в диапазоне конкретных дат
- Выберите список всех клиентов, которые имели их п-го порядка в течение определенного диапазона дат (как правило, конкретный месяц).
- Этот список должен содержать: идентификатор клиента, сумма первых п порядков
Мои таблицы что-то вроде этого:
- [dbo.customers]: CUSTOMERID
- [ДБО .]: orderID, customerID, orderDate, orderTotal
Вот что я пытался до сих пор:
-- Let's assume our threshold (n) is 10
-- Let's assume our date range is April 2013
-- Get customers that already had n orders before the beginning of the given date range.
DECLARE @tmpcustomers TABLE (tmpcustomerID varchar(8))
INSERT INTO
@tmpcustomers
SELECT
c.customerID
FROM
orders o
INNER JOIN customers c ON o.customerID = c.customerID
WHERE
o.orderDate < '2013-04-01'
GROUP BY c.customerID
HAVING (COUNT(o.orderID) >= 10)
-- Now get all customers that have n orders sometime within the given date range
-- but did not have n orders before the beginning of the given date range.
SELECT
a.customerID, SUM(orderTotal) AS firstTenOrderTotal
SELECT
o.customerID, o.orderID, o.orderTotal
FROM
orders o
INNER JOIN customers c ON c.customerID = o.customerID
WHERE
a.customerID NOT IN (SELECT tmpcustomerID FROM @tmpcustomers)
AND
o.orderDate > '2013-04-01'
AND
o.orderDate < '2013-05-01'
GROUP BY c.customerID
HAVING COUNT(o.orderID) >= 10
Это похоже на работу, но это неуклюжее и медленно. Еще одна большая проблема заключается в том, что firstTenOrderTotal на самом деле является SUM от общего количества заказов к концу данного диапазона дат и не обязательно в первую очередь. 10.
Любые предложения для лучшего подхода были бы высоко оценены.
Спасибо за ответ. – sqlhurtsmyheadsometimes
Спасибо за ответ. 1) Хорошая точка. Я могу удалить соединение из вставки в @tmpcustomers. Я ищу заказы, где дата до диапазона дат, потому что я в основном выбираю список идентификаторов для исключения во втором запросе. Я получаю список людей, у которых уже было 10 или более заказов до начала диапазона дат, а затем исключая их из моего следующего запроса. Теперь, когда я действительно объясняю, что происходит, я думаю, что я слишком много думал об этой части, и это может быть ненужным. – sqlhurtsmyheadsometimes
Чтобы прояснить мое намерение - я хочу выбрать всех клиентов, которые достигли своего общего порядка в пределах указанного диапазона. Мне также нужна сумма этих первых n порядковых сумм. – sqlhurtsmyheadsometimes