我的服务订单数据中有一个日期字段,可以有多种状态(排队、完成、取消),并且我正在尝试使我的案例陈述在队列日期晚于完成日期的情况下正确符合条件(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)
下面是一个示例,您可以将 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 |
以下是如何将其合并到查询中的示例:
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);