#sql-server #tsql
#sql-сервер #tsql
Вопрос:
Я пытаюсь получить следующие данные:
- Перечислите всех клиентов, которые заказали дважды или более за последние 12 месяцев
- Перечислите всех клиентов, которые сделали заказ только один раз за последние 12 месяцев
- Перечислите всех клиентов, которые не соответствуют приведенным выше критериям
Я использую SQL Server 11.0.
У меня есть следующие таблицы:
dbo.[Заказ]:
CustomerID
OrderID
dbo.Customer:
BusinessName
Postcode
dbo.AccountCallbacks:
UserId
NotInterestedReasonID
Мне нужно количество всех заказов от dbo.[Заказ] где последняя запись в dbo.У AccountCallbacks был идентификатор пользователя ‘6EAE3206-519E-4DE7-B10B-6F2476D7D20F’ и нулевой NotInterestedReasonID между каждым из указанных выше диапазонов дат, а затем для всего остального.
Я не уверен, какую другую информацию предоставить, это то, что я придумал в настоящее время, но чувствую, что я делаю это своеобразно!
SELECT
Customer.CustomerID,
BusinessName,
Postcode,
NumOrders
FROM
Customer
INNER JOIN
(SELECT
CustomerID,
COUNT(OrderID) AS NumOrders
FROM
dbo.[Order]
WHERE
UserId = '6EAE3206-519E-4DE7-B10B-6F2476D7D20F'
AND NOT (PaymentDate IS NULL)
AND OrderDate <= DATEADD(MONTH, -12, GETDATE())
GROUP BY
CustomerID) AS payingCustomers ON Customer.CustomerID = payingCustomers.CustomerID
INNER JOIN
(SELECT
CustomerID,
MAX(CallbackDate) AS LastCallbackDate
FROM
dbo.AccountCallBacks
WHERE
NotInterestedReasonID IS NULL
GROUP BY
CustomerID) AS otherCustomers ON Customer.CustomerID = otherCustomers.CustomerID
ORDER BY
NumOrders DESC
Как вы уже догадались, SQL — не самая сильная моя сторона! Я действительно надеюсь, что предоставил необходимую информацию, если нет, дайте мне знать.
Пример данных:
Обратные вызовы учетных записей:
CallbackID UserID CustomerID Created CallbackDate Enabled CallbackTimeID NotInterestedReasonID
16 695624B5-90E0-45C0-AFCF-07C7A275BE6E 504 2011-02-01 10:40:37.183 2015-10-08 1 3 1
17 695624B5-90E0-45C0-AFCF-07C7A275BE6E 505 2011-02-01 10:40:37.220 2011-11-01 0 3 NULL
18 2B37842F-33AF-4777-9FC7-3D4F648F5D8F 506 2011-02-01 10:40:37.263 2012-08-20 0 1 NULL
19 2B37842F-33AF-4777-9FC7-3D4F648F5D8F 508 2011-02-01 10:40:37.300 2012-07-20 0 1 NULL
20 2B37842F-33AF-4777-9FC7-3D4F648F5D8F 509 2011-02-01 10:40:37.340 2014-02-10 0 1 NULL
Заказ:
OrderID CustomerID UserID OrderDate PaymentTypeID PaymentStatusID PaymentDate TransactionRef PurchaseOrderNumber
44523 4199 695624B5-90E0-45C0-AFCF-07C7A275BE6E 2016-10-11 16:54:01.350 1 2 2016-10-11 16:57:13.000 011194
44522 3748 695624B5-90E0-45C0-AFCF-07C7A275BE6E 2016-10-11 16:13:00.290 1 2 2016-10-11 16:13:57.000 011486
44521 1812 2B37842F-33AF-4777-9FC7-3D4F648F5D8F 2016-10-11 16:08:16.923 1 2 2016-10-11 16:09:33.000 082663
Клиент:
CustomerID BusinessName Postcode
502 Company 1 BP3 6UK
503 Company Name BP3 6BK
504 Company ABC SS13 1LS
Ожидаемый результат: (это будет другой набор данных в зависимости от того, какой это «отчет», как указано выше)
CustomerID BusinessName Postcode
799 Company2 LTD YO17 6YA
5586 Company3 Plc EH3 9DJ
5638 MR A ENG LTD EP4 1PL
6707 DUSTO Ltd NE22 7LB
Комментарии:
1. Пожалуйста, добавьте примерные данные и ожидаемый результат
2. Добавлены примеры данных из каждой таблицы и ожидаемый результат. Спасибо
3. @MichaelEaton Я обновлю свой ответ, если это не сработает, и если вы можете объяснить мне третий вопрос.
Ответ №1:
Попробуйте что-то вроде этого:
Перечислите всех клиентов, которые заказали дважды или более за последние 12 месяцев
SELECT COUNT(o.OrderID), o.CustomerID
FROM Order o
WHERE o.UserID = '6EAE3206-519E-4DE7-B10B-6F2476D7D20F'
AND o.OrderDate > DATEADD(MONTH, -12, GETDATE())
GROUP BY o.CustomerID
HAVING COUNT(o.OrderID) > 2
Перечислите всех клиентов, которые сделали заказ только один раз за последние 12 месяцев
SELECT COUNT(o.OrderID), o.CustomerID
FROM Order o
WHERE o.UserID = '6EAE3206-519E-4DE7-B10B-6F2476D7D20F'
AND o.OrderDate > DATEADD(MONTH, -12, GETDATE())
GROUP BY o.CustomerID
HAVING COUNT(o.OrderID) = 1
Я немного запутался в проблеме. Вам нужны все клиенты, которые «не соответствуют критериям». Какие критерии?
Комментарии:
1. Я предполагаю, что «Не соответствует критериям выше» будет равно 0 заказам в диапазоне дат.
2. @Gary Да, это все, что вам нужно было бы сделать. Работает ли это решение для вас?
3. @Gary только что понял, что ты не ОП, ха. Я подумал, что «0 заказов в течение диапазона дат» может быть тем, что он имел в виду, но не был уверен.