【问题标题】:SQL Server count orders within dates per customerSQL Server 在每个客户的日期内计算订单
【发布时间】:2016-10-11 19:57:53
【问题描述】:

我正在尝试获取以下数据:

  • 列出过去 12 个月内订购过两次或两次以上的所有客户
  • 列出过去 12 个月内仅订购过一次的所有客户
  • 列出不符合上述条件的所有客户

我使用的是 SQL Server 11.0。

我有以下表格:

dbo.[订单]

CustomerID
OrderID

dbo.Customer

BusinessName
Postcode

dbo.AccountCallbacks

UserId
NotInterestedReasonID

我需要计算来自 dbo.[Order] 的所有订单,其中 dbo.AccountCallbacks 中的最后一条记录的 UserID 为“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 不是我的强项!我真的希望我已经提供了所需的信息,如果没有,请告诉我。

示例数据:

AccountCallbacks:

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    

【问题讨论】:

  • 请添加示例数据和预期输出
  • 添加了来自每个表的示例数据和预期的输出。谢谢
  • @MichaelEaton 如果这些都不起作用,我会更新我的答案,如果你能为我解释第三个问题。

标签: sql-server tsql


【解决方案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

我对这个问题有点困惑。您想要所有“不符合标准”的客户。什么标准?

【讨论】:

  • “不符合上述条件”在日期范围内将是 0 个订单,这是我的猜测。
  • @Gary 是的,这就是你所要做的。这个解决方案对你有用吗?
  • @Gary 刚刚意识到你不是 OP,哈。我认为“日期范围内的订单数为 0”可能是他的意思,但不确定。
猜你喜欢
  • 2018-04-13
  • 1970-01-01
  • 2013-05-05
  • 2017-08-12
  • 2021-03-15
  • 2016-01-02
  • 2019-07-22
  • 1970-01-01
  • 2013-12-15
相关资源
最近更新 更多