Oracle SQL-使用CASE WHEN选择适当的日期字段

时间:2019-05-29 15:01:48

标签: sql oracle case

我有一个复杂的问题,我无法终生弄清楚脑海中的逻辑。

我正在尝试解决构建查询以报告重大事件的正确日期的问题。从本质上讲,我的公司正在尝试通过查看何时购买(数量+)零件,何时制造(数量+)零件,何时销售(数量-)零件或何时使用该零件建造更高的零件来跟踪库存管理。组装零件(数量-)。

我正在使用的表结构如下:
enter image description here

这里有4种事件,每种都有自己的唯一标识符,每种都有发生该事件的日期。

然后,我有了“事件”表,该表实际上具有事务列表,如下所示: enter image description here

(请注意,我已经删除了一些不相关的字段名称)。

我要完成的工作是使用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从另一个表中正确选择一个值。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

尝试使用nvl功能 用于组织事件表。 NVL(PO_ID,NVL(MO_ID,NVL(CO_ID,NVL(Sale_ID,0))))AS IDS

然后

Events.Number = IDS

希望有帮助