【问题标题】:Calculating Days Since Last OrderDate TSQL Query计算自上次订购日期以来的天数 SQL 查询
【发布时间】:2018-09-25 00:39:45
【问题描述】:

我的任务是编写一个查询,返回 CustomerID 为 90 的客户的所有订单,以及订单总数和自客户上一次订单以来的天数。

我将使用相关子查询来计算距离上一个订单的天数。

我正在使用 WideWorldImporters 示例数据库中的表 Sales.Orders 和 Sales.OrderLines。

我需要有 OrderID、OrderDate、OrderTotal 和 DaysSincePreviousOrder 列。后者是自上次客户订单以来的天数。

我的解决方案尝试开始设置我的查询如下:

SELECT 
O.OrderID,
O.OrderDate,
ISNULL(SUM(OL.UnitPrice * OL.Quantity), 0.00) AS OrderTotal,
DATEDIFF(DAY, 
(
    SELECT MAX(OrderDate)
    WHERE OrderDate < O.OrderDate 
), O.OrderDate) AS DaysSincePreviousOrder       

FROM Sales.Orders O
    INNER JOIN Sales.OrderLines OL ON OL.OrderID = O.OrderID
            AND O.CustomerID = 90
GROUP BY O.OrderID, O.OrderDate, O.CustomerID
ORDER BY O.OrderID;

我不确定如何在相关子查询中获取客户先前订单的日期。

我的前两个结果应该是这样的:

**OrderID**---  **OrderDate**   ------**OrderTotal**    -----**DaysSincePreviousOrder**  
1455    -------2013-01-29   -----365.00    --------- NULL  
1890    -------2013-02-06   -----915.00     ----------8

任何帮助将不胜感激。

【问题讨论】:

  • 请注意,上一个订单日期是比当前订单日期早的最新订单日期。
  • 你说你要使用关联子查询。为什么你特别想使用这个方法。您对不需要子查询的方式感兴趣吗?
  • 问题明确指出我必须使用相关子查询。我希望我不必
  • 好的。如果您有一列日期值,您会使用什么查询来查找这些日期中的最新日期?
  • 我会使用 MAX(O.OrderDate)

标签: sql-server tsql subquery correlated-subquery


【解决方案1】:

也许这会有所帮助。

create table MyOrder ( OrderID int,
                       CustomerID int,
                       OrderDate  date )

insert into MyOrder ( OrderID, CustomerID, OrderDate ) values
( 1, 9999, '2018-05-01T00:00:00.000' ),
( 2, 9999, '2018-05-10T00:00:00.000' ),
( 3, 9999, '2018-06-10T00:00:00.000' ),
( 4, 7777, '2018-07-01T00:00:00.000' ),
( 5, 7777, '2018-07-15T00:00:00.000' ),
( 6, 3333, '2018-09-09T00:00:00.000' )

select OrderID, 
       CustomerID, 
       OrderDate,

       ( select max(OrderDate) 
         from MyOrder 
         where     CustomerID = O.CustomerID 
               and OrderDate < O.OrderDate ) 
         as PreviousOrderDate

from MyOrder O
order by CustomerID, OrderDate

【讨论】:

  • 啊,所以看起来我在上面的查询中唯一缺少的是我的子查询中的 FROM Sales.Orders。感谢您的帮助
  • 您还缺少 CustomerID=O.CustomerID。您只需要此客户的上一个日期。
【解决方案2】:

您可以使用LAG () OVER () 获取上一个订单日期。然后计算日期差

SELECT O.OrderDate,
       DATEDIFF(DAY, 
                LAG(O.OrderDate) OVER (PARTITION BY CustomerID Order by O.OrderDate),
                O.OrderDate) AS DaysSincePreviousOrder

【讨论】:

  • 这似乎是使用 LAG 的方法,但是我需要使用相关子查询来计算自上一个订单以来的天数。我将如何使用此 DATEDIF 语法来做到这一点?
【解决方案3】:

David Dubois 的答案几乎是正确的,但它没有考虑到同一天的订单。

where CustomerID = O.CustomerID and OrderID < O.OrderID

而不是

where CustomerID = O.CustomerID and OrderDate < O.OrderDate

会解决这个问题。

【讨论】:

    猜你喜欢
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2021-12-10
    • 1970-01-01
    • 2016-11-12
    • 2015-08-04
    • 1970-01-01
    相关资源
    最近更新 更多