选择列的最后一个实例,但将不同列与 CASE 进行比较

问题描述 投票:0回答:1

我期待 3 列:来自 TOrder 的订单号、最后一个实例(最大)OrderEvent ID,并且我想将 case/when 应用于另一列 (ordereventtypeid)。

订单号和最后一个实例有效。但是,我无法让第三列工作。本质上,我想为每个

OrderEventId
拉取
OrderId
的最后一个实例,然后将
CASE/WHEN
应用于该行。 下面发生的情况是,为所有这些延迟返回“T&R”延迟,而不是仅返回最后一个
OrderEventTypeID
为“107”的延迟。

SELECT 
   TOrder.OrderNumber
   ,(SELECT MAX (OrderEventID) FROM TOrderEvent
    WHERE TOrderEvent.OrderID = TOrder.OrderID
    ) AS 'Delay SubQ'
   ,CASE 
        WHEN EXISTS (SELECT MAX (OrderEventID) FROM TOrderEvent
                     WHERE TOrderEvent.OrderID = TOrder.OrderID
                       AND TOrderEvent.OrderEventTypeID IN (107)) 
            THEN 'T&R Delay'
            ELSE ''
    END AS 'Delay Case'
FROM 
    TOrder
WHERE 
    TOrder.CustomerId IN (14758, 25167)
    AND TOrder.OrderDate >= '1/1/2024'
    AND TOrder.OrderStatusID NOT IN (1206, 1208)

我尝试过使用子查询、联接等。当加入

TOrderEvent
并使用
MAX ON TOrderEvent.OrderEventID
时,我为每个 ordereventid 获取一行,而不是为每个 orderid 获取一行,仅包含 ordereventid 的最后一个实例。

我正在将 SSMS 19.0.20209 与 Azure 托管 SQL 即服务结合使用。

sql sql-server azure-sql-database
1个回答
0
投票

试试这个

SELECT 
    TOrder.OrderNumber,
    oe.MaxOrderEventID AS [Delay SubQ],
    CASE 
        WHEN oe.OrderEventTypeID = 107 THEN 'T&R Delay'
        ELSE ''
    END AS [Delay Case]
FROM 
    TOrder
CROSS APPLY
    (
        SELECT TOP 1 
            TOrderEvent.OrderEventID AS MaxOrderEventID,
            TOrderEvent.OrderEventTypeID
        FROM 
            TOrderEvent
        WHERE 
            TOrderEvent.OrderID = TOrder.OrderID
        ORDER BY 
            TOrderEvent.OrderEventID DESC
    ) oe
WHERE 
    TOrder.CustomerId IN (14758, 25167)
    AND TOrder.OrderDate >= '2024-01-01'
    AND TOrder.OrderStatusID NOT IN (1206, 1208);
© www.soinside.com 2019 - 2024. All rights reserved.