Oracle SQL — использование CASE WHEN для выбора правильного поля даты

У меня сложная проблема, и я не могу хоть убей сообразить логику в своей голове.

Я пытаюсь решить проблему построения запроса, сообщающего правильные даты для существенного события. По сути, моя компания пытается отслеживать управление запасами, наблюдая, когда мы покупаем (количество+) деталь, когда мы производим (количество+) деталь, когда мы продаем (количество-) деталь или когда мы используем эту деталь для создания более высокого уровня. сборочная деталь (количество-).

Структуры таблиц, с которыми я работаю, выглядят так:
Oracle SQL — использование CASE WHEN для выбора правильного поля даты

Где может быть 4 типа событий, каждое из которых имеет свой уникальный идентификатор и у каждого есть дата, когда это событие происходит.

Затем у меня есть таблица «Происшествия», в которой на самом деле есть список транзакций, который выглядит так: Oracle SQL — использование CASE WHEN для выбора правильного поля даты

(Обратите внимание, что я исключил некоторые нерелевантные имена полей).

То, что я пытаюсь сделать, это использовать оператор 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 для правильного выбора значения из другой таблицы, когда моя текущая строка содержит уникальный идентификатор.

Если бы вы динамически создавали список внешних ключей, а затем использовали его для объединения событий, это было бы проще. Вы также можете выбрать дату из событий, где events.number IN ('') в CTE вместе с объявлением типа и использовать это. например `; с cteExample ([PK], [Col], [Date]) as (выберите h.PO_ID, 'Заказ на покупку', дата из событий, присоединяйтесь к событиям h на событиях.Number = события.PO_ID объединение всех выберите ...) выберите случай, когда тип = "Заказ на покупку", затем a.date, где [столбец] = "Заказ на покупку" ...

Sean Brookins 29.05.2019 17:07

Вам не нужно публиковать проприетарные данные, поддельные данные хороши, если они репрезентативны — и вы показываете как образцы данных, так и ожидаемый результат для этих данных. (Плюс ваши текущие усилия и то, что они производят, желательно, чтобы мы могли видеть, где вы идете не так). См. минимальный воспроизводимый пример. И, пожалуйста, размещайте форматированный текст, а не изображения.

Alex Poole 29.05.2019 17:09

Уместна ли уценка? Я могу переформатировать эти таблицы как таковые и заполнить их фиктивными (но репрезентативными) данными @AlexPoole

artemis 29.05.2019 17:13
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуйте кейс по условию соединения

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 в случае, если дата не возвращается.

Sean Brookins 29.05.2019 17:08

Как это будет работать в условиях отсутствия даты? Добавлю ли я ELSE?

artemis 29.05.2019 17:13

@JerryM Вы говорите, что в событиях будут предметы с датой, но без соответствующего Events.Type? Если да, то что бы вы хотели вернуть?

JohnHC 29.05.2019 17:16

Я не вижу этого в моих текущих данных @JohnHC, но я хотел бы учесть это в случае, если это произойдет. Я думаю, что значение "NULL" будет подходящим.

artemis 29.05.2019 17:17

@ Джерри М. Мне нужно увидеть более широкий запрос, а не только этот фрагмент. Поскольку это inner join, в случае отсутствия данных данные не возвращаются.

JohnHC 29.05.2019 17:18

Я не корректно сформулировал вопрос. Но, используя тестовые данные, это правильно. Большое спасибо!

artemis 29.05.2019 18:13

попробуйте использовать функцию nvl для организации таблицы событий. NVL( PO_ID, NVL( MO_ID, NVL(CO_ID, NVL(Sale_ID, 0) ))) AS IDS

тогда

События.Число = IDS

Надеюсь, поможет

Другие вопросы по теме