案例陈述多个条件 - 日期和状态

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

我的服务订单数据中有一个日期字段,可以有多种状态(排队、完成、取消),并且我正在尝试使我的案例陈述在队列日期晚于完成日期的情况下正确符合条件(SO 是完成一次后重新打开)。

我已经写了这个,但它给了我两行数据 - 一行包含特定 SO 的正确完整日期,在本例中为 NULL,另一行包含原始完整日期。

我的数据在 case 语句等之前看起来像这样:

所以# 日期 代码
12345 2/1/23 队列
12345 1/28/23 比较
12345 1/27/23 队列

此 SO 已完成,然后重新打开,我想将其读为:

所以# 排队日期 比较日期
12345 2/1/23
SELECT
M.BI_SO_NBR,
SQ.start_queue_date,
SQ.CANCL_DATE,
case when (ta.bi_work_event_cd ='COMP' and comp_date < start_queue_date) then null else SQ.COMP_DATE  end as comp_date2
FROM
BI_SO_MASTER M
LEFT OUTER JOIN BI_SO_DET D ON M.BI_SO_NBR = D.BI_SO_NBR
LEFT OUTER JOIN BI_WRKFLW_TASKS T ON D.BI_WRKFLW_KEY = T.BI_WRKFLW_KEY
LEFT OUTER JOIN BI_TASK_ASG_SCHED A ON T.BI_WRKFLW_TASKS_KEY = A.BI_WRKFLW_TASK_KEY
LEFT OUTER JOIN BI_TASK_ACT TA oN T.BI_WRKFLW_TASKS_KEY = TA.BI_WRKFLW_TASKS_KEY
LEFT OUTER JOIN 
     (SELECT  
          TA.BI_WRKFLW_TASKS_KEY, 
          max(CASE WHEN (ta.bi_work_event_cd ='START') THEN ta.bi_event_dt_tm
            ELSE (CASE WHEN (ta.bi_work_event_cd = 'QUEUE') THEN ta.bi_event_dt_tm 
            else NULL END) END) AS start_queue_date ,
          max(CASE WHEN(  ta.bi_work_event_cd ='COMP') THEN ta.bi_event_dt_tm
          else NULL ENd) AS COMP_DATE,
          max(CASE WHEN(ta.bi_work_event_cd ='CANCL') THEN ta.bi_event_dt_tm
          else NULL END) AS CANCL_DATE
      FROM bi_task_act ta 
      GROUP BY ta.bi_wrkflw_tasks_key ) SQ 
   ON (T.BI_WRKFLW_TASKS_KEY = SQ.BI_WRKFLW_TASKS_KEY)  
sql date case oracle-sqldeveloper
1个回答
0
投票

下面是一个示例,您可以将 CASE 语句移至子查询,然后将其连接到现有结果集。您可以使用类似的逻辑来替换您的

SQ
子查询。如果您仍然获得额外的行,我的猜测是,它是将
BI_TASK_ACT
表连接到
SQ
子查询。

架构(MySQL v5.7)

CREATE TABLE `bi_task_act` (
    `so_number` VARCHAR(20),
    `so_date` DATE,
    `so_code` VARCHAR(20)
);

INSERT INTO bi_task_act
  (`so_number`, `so_date`, `so_code`)
VALUES
  ('12345', '2023-02-01',   'Queue'),
  ('12345', '2023-01-28',   'Comp'),
  ('12345', '2023-01-27',   'Queue'),
  ('67890', '2023-11-01',   'Queue'),
  ('67890', '2023-12-28',   'Comp');

查询#1

SELECT a.so_number,
       a.queue_date,
       a.comp_date,
       CASE
           WHEN a.comp_date < a.queue_date THEN NULL
           ELSE a.comp_date
       END AS comp_date2
FROM
  (SELECT a.so_number,
          MAX(CASE
                  WHEN a.so_code = 'Queue' THEN a.so_date
              END) AS queue_date,
          MAX(CASE
                  WHEN a.so_code = 'Comp' THEN a.so_date
              END) AS comp_date
   FROM bi_task_act a
   GROUP BY a.so_number) a;
so_number 队列_日期 comp_date comp_date2
12345 2023-02-01 2023-01-28
67890 2023-11-01 2023-12-28 2023-12-28

在 DB Fiddle 上查看

以下是如何将其合并到查询中的示例:

SELECT M.BI_SO_NBR,
       SQ.start_queue_date,
       SQ.CANCL_DATE,
       SQ.comp_date2
FROM BI_SO_MASTER M
LEFT OUTER JOIN BI_SO_DET D ON M.BI_SO_NBR = D.BI_SO_NBR
LEFT OUTER JOIN BI_WRKFLW_TASKS T ON D.BI_WRKFLW_KEY = T.BI_WRKFLW_KEY
LEFT OUTER JOIN BI_TASK_ASG_SCHED A ON T.BI_WRKFLW_TASKS_KEY = A.BI_WRKFLW_TASK_KEY
LEFT OUTER JOIN
  (SELECT a.*,
          CASE
              WHEN a.COMP_DATE < a.start_queue_date THEN NULL
              ELSE a.COMP_DATE
          END AS comp_date2
   FROM
     (SELECT TA.BI_WRKFLW_TASKS_KEY,
             max(CASE
                     WHEN (ta.bi_work_event_cd ='START') THEN ta.bi_event_dt_tm
                     ELSE (CASE
                               WHEN (ta.bi_work_event_cd = 'QUEUE') THEN ta.bi_event_dt_tm
                               ELSE NULL
                           END)
                 END) AS start_queue_date,
             max(CASE WHEN(ta.bi_work_event_cd ='COMP') THEN ta.bi_event_dt_tm
                     ELSE NULL
                 END) AS COMP_DATE,
             max(CASE WHEN(ta.bi_work_event_cd ='CANCL') THEN ta.bi_event_dt_tm
                     ELSE NULL
                 END) AS CANCL_DATE
      FROM bi_task_act ta
      GROUP BY ta.bi_wrkflw_tasks_key) a) SQ ON (T.BI_WRKFLW_TASKS_KEY = SQ.BI_WRKFLW_TASKS_KEY);
© www.soinside.com 2019 - 2024. All rights reserved.