SQL Server подсчитывает заказы в пределах дат для каждого клиента

#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 заказов в течение диапазона дат» может быть тем, что он имел в виду, но не был уверен.