Показать последний заброшенный заказ, используя sql - PullRequest
0 голосов
/ 14 января 2020

У меня есть три таблицы: Клиент, Продукт, Заказы

Я пытаюсь идентифицировать всех клиентов, которые создали отмененный заказ (order_status! = 'Выполнено'), но не имеют других заказов, которые были выполнены (order_status ! = 'complete').

У меня есть следующий запрос, который возвращает все заказы, которые соответствуют этому критерию, но имеют несколько экземпляров клиента из различных заказов, мне просто нужен ОДИН экземпляр этого клиента и предпочтительно последний заказ был отменен.

SELECT
c.Id as Id,
c.Name as FullName,
o.Id as Order_Id,
o.OrderStatus,
o.OrderDate,
o.PaidByCC,
p.ProductStatus,
From Orders o
Join Customers c
On c.Id = o.CustomerId
Join Product p
On o.ProductId = p.[Product ID]
WHERE o.Type = 'Service'
    AND o.PaidByCC = 0
    AND o.OrderStatus IS NULL
    AND p.State = 'available'
    AND CONVERT(date, o.OrderDate) >= Convert(date, DATEADD(day, -30, GETDATE()))
    AND NOT EXISTS (Select o1.Id
                    From Orders o1
                    Where o1.OrderStatus = 'Placed'
                    AND o.CustomerId = o1.CustomerId)                    

Как я могу это сделать?

1 Ответ

0 голосов
/ 14 января 2020

Вот что у меня есть: пришлось поместить его во временную таблицу, потому что sql 2005 не поддерживает cte.

    SELECT
    c.Id as Id,
    c.Name as FullName,
    o.Id as Order_Id,
    o.OrderStatus,
    o.OrderDate,
    o.PaidByCC,
    p.ProductStatus,
    From Orders o
    Join Customers c
    On c.Id = o.CustomerId into #AllAbandoned
    Join Product p
    On o.ProductId = p.[Product ID]
    WHERE o.Type = 'Service'
        AND o.PaidByCC = 0
        AND o.OrderStatus IS NULL
        AND p.State = 'available'
        AND CONVERT(date, o.OrderDate) >= Convert(date, DATEADD(day, -30, GETDATE()))
        AND NOT EXISTS (Select o1.Id
                        From Orders o1
                        Where o1.OrderStatus = 'Placed'
                        AND o.CustomerId = o1.CustomerId)  
-- Here we only want the abandoned
        AND order_status != 'completed'

- здесь мы говорим, получить тот, который самый последний

Select * from #AllAbandoned a where not exists(Select 1 From #AllAbandoned b where a.Id = b.Id and a.OrderDate < b.OrderDate)
...