Расчет дней с момента последнего запроса заказа TSQL - PullRequest
0 голосов
/ 25 сентября 2018

Моя задача - написать запрос, который возвращает все заказы для клиента с CustomerID, равным 90, а также общее количество заказов и количество дней с момента предыдущего заказа клиента.

Я должен использовать коррелированный подзапросрассчитать количество дней с момента предыдущего заказа.

Я использую таблицы Sales.Orders и Sales.OrderLines в базе данных образца WideWorldImporters.

Мне нужны столбцы 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

Любая помощь будет высоко ценится.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

Может быть, это поможет.

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
0 голосов
/ 27 сентября 2018

Дэвид Дюбуа имеет почти правильный ответ, однако он не учитывает заказы, которые имеют тот же день.

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

вместо

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

решит эту проблему.

0 голосов
/ 25 сентября 2018

вы можете использовать LAG () OVER (), чтобы получить дату предыдущего заказа.А затем вычислите разницу в датах

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