У меня сложная проблема, и я не могу хоть убей сообразить логику в своей голове.
Я пытаюсь решить проблему построения запроса, сообщающего правильные даты для существенного события. По сути, моя компания пытается отслеживать управление запасами, наблюдая, когда мы покупаем (количество+) деталь, когда мы производим (количество+) деталь, когда мы продаем (количество-) деталь или когда мы используем эту деталь для создания более высокого уровня. сборочная деталь (количество-).
Структуры таблиц, с которыми я работаю, выглядят так:
Где может быть 4 типа событий, каждое из которых имеет свой уникальный идентификатор и у каждого есть дата, когда это событие происходит.
Затем у меня есть таблица «Происшествия», в которой на самом деле есть список транзакций, который выглядит так:
(Обратите внимание, что я исключил некоторые нерелевантные имена полей).
То, что я пытаюсь сделать, это использовать оператор CASE...WHEN
для выбора правильной даты на основе внешнего ключа текущей строки.
Итак, что-то по эффекту:
CASE
WHEN Type = "Purchase Order" THEN (SELECT Date FROM Events WHERE Events.Number = Happenings.PO_ID)
WHEN TYPE = "Make Order" THEN (SELECT Date FROM Events WHERE Events.Number = Happenings.MO_ID)
WHEN TYPE = "Sale" THEN (SELECT Date FROM Events WHERE Events.Number = Happenings.Sale_ID)
WHEN TYPE = "Create Order" THEN (SELECT Date FROM Events WHERE Events.Number = Happenings.CO_ID)
ELSE NULL AS Event_Date
К сожалению, я не могу опубликовать слишком много данных, поскольку они принадлежат компании, но это суть того, чего я пытаюсь достичь; используя CASE...WHEN
для правильного выбора значения из другой таблицы, когда моя текущая строка содержит уникальный идентификатор.
Вам не нужно публиковать проприетарные данные, поддельные данные хороши, если они репрезентативны — и вы показываете как образцы данных, так и ожидаемый результат для этих данных. (Плюс ваши текущие усилия и то, что они производят, желательно, чтобы мы могли видеть, где вы идете не так). См. минимальный воспроизводимый пример. И, пожалуйста, размещайте форматированный текст, а не изображения.
Уместна ли уценка? Я могу переформатировать эти таблицы как таковые и заполнить их фиктивными (но репрезентативными) данными @AlexPoole
Попробуйте кейс по условию соединения
select e1.date
from events e1
inner join happenings h2
on e1.Number = case when e1.type = 'Purchase' then h2.PO_ID
when e1.type = 'Make' then h2.MO_ID
...
end
Это даже более прямолинейно, чем мой метод CTE - может потребоваться обработчик isnull в случае, если дата не возвращается.
Как это будет работать в условиях отсутствия даты? Добавлю ли я ELSE
?
@JerryM Вы говорите, что в событиях будут предметы с датой, но без соответствующего Events.Type
? Если да, то что бы вы хотели вернуть?
Я не вижу этого в моих текущих данных @JohnHC, но я хотел бы учесть это в случае, если это произойдет. Я думаю, что значение "NULL" будет подходящим.
@ Джерри М. Мне нужно увидеть более широкий запрос, а не только этот фрагмент. Поскольку это inner join
, в случае отсутствия данных данные не возвращаются.
Я не корректно сформулировал вопрос. Но, используя тестовые данные, это правильно. Большое спасибо!
попробуйте использовать функцию nvl для организации таблицы событий. NVL( PO_ID, NVL( MO_ID, NVL(CO_ID, NVL(Sale_ID, 0) ))) AS IDS
тогда
События.Число = IDS
Надеюсь, поможет
Если бы вы динамически создавали список внешних ключей, а затем использовали его для объединения событий, это было бы проще. Вы также можете выбрать дату из событий, где events.number IN ('') в CTE вместе с объявлением типа и использовать это. например `; с cteExample ([PK], [Col], [Date]) as (выберите h.PO_ID, 'Заказ на покупку', дата из событий, присоединяйтесь к событиям h на событиях.Number = события.PO_ID объединение всех выберите ...) выберите случай, когда тип = "Заказ на покупку", затем a.date, где [столбец] = "Заказ на покупку" ...