首页 > 解决方案 > 如何过滤条件为真至少一次

问题描述

我需要过滤到仅在至少一项任务中具有“服务”工作组值的服务订单。但是,如果至少有一个任务行具有该值,我不想删除不是 work group = "Service" 的行。最终结果将忽略服务订单中没有至少一个等于“SERVICE”的 BI_WRKFLW_TASK_KEY 的所有数据。我知道如何做普通的过滤器,但让它达到这种特殊性超出了我目前的经验。

我已经尝试了普通过滤器,但它们遗漏了属于同一服务订单但没有该工作组的行。

SELECT W.BI_WRKFLW_KEY, 
       T.BI_WORK_EVENT_CD, 
       T.BI_TASK_CD, 
       T.BI_WORKGRP, 
       **M.BI_SO_NBR**, 
       M.BI_SO_TYPE_CD, 
       M.BI_CLOSE_DT,
       M.BI_OPEN_DT, 
       M.BI_SO_STAT_CD, 
       R.BI_WRKFLW_TMPLT_NM, 
       T.BI_WRKFLW_TASK_SEQ_NBR, 
       T.BI_WORKGRP, 
       A.BI_WORK_EVENT_CD,
       A.BI_EVENT_DT_TM, 
       A.SY_JOB_QUEUE_ID, 
       **A.BI_WORKGRP**, 
       A.SY_USER_ID, 
       **A.BI_WRKFLW_TASK_KEY**
FROM BI_WRKFLW W
         LEFT JOIN BI_WRKFLW_TASKS T ON W.BI_WRKFLW_KEY = T.BI_WRKFLW_KEY
         LEFT JOIN BI_SO_DET D ON W.BI_WRKFLW_KEY = D.BI_WRKFLW_KEY
         LEFT JOIN BI_SO_MASTER M ON D.BI_SO_NBR = M.BI_SO_NBR
         LEFT JOIN BI_WRKFLW_TMPLT_REF R ON W.BI_WRKFLW_TMPLT_ID = R.BI_WRKFLW_TMPLT_ID
         LEFT JOIN BI_TASK_ACT A ON T.BI_WRKFLW_TASKS_KEY = A.BI_WRKFLW_TASKS_KEY
WHERE M.BI_OPEN_DT >= ADD_MONTHS(CURRENT_DATE, -'12')
--AND M.BI_SO_TYPE_CD IN ('IVC-NEW1') 
--AND M.BI_SO_STAT_CD LIKE 'O'  
ORDER BY M.BI_SO_NBR, T.BI_EVENT_DT_TM 

任何服务订单至少有一个 BI_WRKFLOW_TASK_CD = "Service" 的服务订单行将被保留,所有其他服务订单都将被过滤掉。

标签: sql

解决方案


我试着把它画出来,我可能不太正确,

我认为您正在要求 BI_SO_MASTER 记录具有 >=1 BI_WRKFLW_TASKS 属于某个组。

尝试使用 CTE 获取具有正确任务的详细信息行,然后您可以找到 SO 人口...然后您可以???不确定最终结果集目标是什么?

;with matchingTasks as (    D.BI_SO_NBR, D.<id> , W.BI_WRKFLW_KEY , T.<key> , A.Key
from BI_WRKFLW W
LEFT JOIN BI_WRKFLW_TASKS T ON W.BI_WRKFLW_KEY = T.BI_WRKFLW_KEY
LEFT JOIN BI_SO_DET D ON W.BI_WRKFLW_KEY = D.BI_WRKFLW_KEY
LEFT JOIN BI_TASK_ACT A ON T.BI_WRKFLW_TASKS_KEY = A.BI_WRKFLW_TASKS_KEYW
Where 
    <good dates> 
    and <A.field is what I am looking for>
)
/*Here you have the SO population
as well as the ids that helped this SO qualify. 
*/
, My_SO_Population as (select Distinct BI_SO_NBR from matchingTasks   )

/*now you can go get what you need. 
the challenge of finding SOs w/ >=1 matching task has been solved...
*/
   select  <necessary fields> from    
My_SO_Population 
join   <whatever you need....this is where i am cloudy>

如果我错过了目标,请告诉我在哪里......


推荐阅读