Я ожидаю 3 столбца: номер заказа из TOrder, идентификатор последнего экземпляра (макс. OrderEvent), и я хочу применить регистр/когда к другому столбцу (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 в качестве службы.
Пожалуйста, прочитайте Как сделать хороший пример, а также отметьте СУБД, которую вы используете.
@ScottHunter Конечно, это приемлемо? TOrder: OrderNumber OrderId – может быть присоединен к TOrderEvent.OrderID (вот как они связаны) TOrderEvent: OrderId – связь с TOrder OrderEventId – автоматически увеличивающийся идентификационный номер (PK). Именно так идентифицируются уникальные строки событий, связанных с заказами. OrderEventTypeID – числовая классификация События. Здесь я пытаюсь применить CASE, то есть, если последний OrderEventId, связанный с заказом, имеет OrderEventTypeID «107», то возвращаю «T&R Delay».
То есть в лучшем случае описание схемы таблицы, а не пример ее содержимого.
Используйте row_number в подзапросе. Learn.microsoft.com/en-us/sql/t-sql/functions/…
@JonasMetzler Здравствуйте, я не знаю, чего еще вы от меня хотите. Код/объяснение отформатировано в соответствии с моей интерпретацией вашей ссылки. Я также сократил запрос с более чем 30 полями до 3, которые все необходимы в реляционных аспектах. Выполнение запроса сводится к минимуму, сохраняя при этом требования к отношениям.
Пожалуйста, прочитайте: Почему мне следует предоставлять минимальный воспроизводимый пример для очень простого SQL-запроса?
Примечание: не используйте одинарные кавычки ('
) для псевдонимов. Одинарные кавычки предназначены для буквальных строк и не ограничивают идентифицирующие имена объектов. У них есть некоторые «подводные камни», поскольку их поведение непоследовательно в зависимости от того, где на них ссылаются. Также устарели некоторые синтаксисы с псевдонимами литеральных строк. Придерживайтесь имен объектов и псевдонимов, которые не требуют идентификации-разделителей, а если вам необходимо их идентифицировать, используйте идентификатор T-SQL, скобки ([]
) или двойные кавычки ANSI-SQL ("
).
Пожалуйста, добавляйте детали к своему вопросу, а не комментарии. Затем вы можете использовать форматированный код и т.д.
Как говорят в Голливуде, показывай, не говори. Почему бы не разместить несколько строк данных в виде таблицы и ожидаемый результат
Попробуйте это
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);
Спасибо Варун Малхотра. Кажется, это работает так, как ожидалось, при первоначальном просмотре/проверке. Однако я не совсем понимаю код, поэтому буду усердно работать, чтобы убедиться, что я понимаю все аспекты. Спасибо, что научили меня.
Я рад, что смог помочь! чтобы понять это, лучше прочитайте о «CROSS APPLY»
Конечно, я сейчас об этом читаю. Еще раз, большое спасибо и будьте уверены: мне не просто нужен ответ... Я возьму ответ и изучу концепцию. :)
Можете ли вы предоставить образец содержимого таблицы и ожидаемые результаты запроса?