在CASE子句中引用要使用的同一SQL列

在CASE子句中引用要使用的同一SQL列,sql,db2,switch-statement,case-when,Sql,Db2,Switch Statement,Case When,我需要在DB2中使用QMF for Qrkstation z/OS进行SQL查询时得到帮助 V11.1修复包3 我正在查询不同表中的几个字段。我也在展示一些时间戳。我需要一个CASE子句,它使用其中一个时间戳 其思想是,其中一个时间戳可以有数据,也可以不为null,因为我正在使用该表的左连接if值,然后将其带出if not then blank,因此CASE子句需要检查该列/字段,如果它有数据,则将值“Delivered”。从下面的图片中可以看出,这种逻辑对我来说是行不通的 select dis

我需要在DB2中使用QMF for Qrkstation z/OS进行SQL查询时得到帮助 V11.1修复包3

我正在查询不同表中的几个字段。我也在展示一些时间戳。我需要一个CASE子句,它使用其中一个时间戳

其思想是,其中一个时间戳可以有数据,也可以不为null,因为我正在使用该表的左连接if值,然后将其带出if not then blank,因此CASE子句需要检查该列/字段,如果它有数据,则将值“Delivered”。从下面的图片中可以看出,这种逻辑对我来说是行不通的

select distinct
    z.po_id, 
    max(CASE 
           WHEN dcus.ship_evnt_tms IS NOT NULL THEN 'Delivered'
           WHEN days(CURRENT_timestamp) - days(Z.CAD_TMS) <= 0 THEN 'On time CAD'
           WHEN days(CURRENT_timestamp) - days(Z.CAD_TMS) between 1 and 2 THEN 'Less than 3 days after CAD'
           WHEN days(CURRENT_timestamp) - days(Z.CAD_TMS) between 3 and 5 THEN 'Between 3 & 5 days after CAD'
           WHEN days(CURRENT_timestamp) - days(Z.CAD_TMS) between 6 and 10 THEN 'Between 6 & 10 days after CAD'
           WHEN days(CURRENT_timestamp) - days(Z.CAD_TMS) >= 10 THEN 'More than 10 days after CAD'
           ELSE 'Non physical' 
       END) AS Aging,
    max(z.cad_tms) as cad_tms, 
    max(dcus.ship_evnt_tms) as DELV_DATE_CUS
from
    SCHEMA.TABLE z
left join 
    SCHEMA.TABLE1 A ON z.po_id = a.po_id
left join
    SCHEMA.TABLE2 scus ON (A.SHIP_ID = scus.SHIP_ID AND A.SHIP_TO_LOC_CODE = scus.SHIP_TO_LOC_CODE and scus.loc_type = 'CUS')
left join 
    SCHEMA.TABLE3 dcus ON (scus.SHIP_ID = dcus.SHIP_ID_856 AND scus.SHIP_TO_LOC_CODE = dcus.SHIP_TO_LOC_CD856 
AND dcus.SHIP_EVNT_CD = 'D')
left join
    SCHEMA.TABLE2 scdc ON (A.SHIP_ID = scdc.SHIP_ID AND A.SHIP_TO_LOC_CODE = scdc.SHIP_TO_LOC_CODE and scdc.loc_type = 'CDC')
left join 
    SCHEMA.TABLE3 dcdc ON (scdc.SHIP_ID = dcdc.SHIP_ID_856 AND scdc.SHIP_TO_LOC_CODE = dcdc.SHIP_TO_LOC_CD856 
AND dcdc.SHIP_EVNT_CD = 'D')
如图所示,在最后一列上有数据tms的前几行应根据CASE子句逻辑显示为已交付,至少据我所知,此外,最后一条记录根据另一条WHEN语句显示正确的计算和结果

我尝试删除表别名dcus以引用列值本身,但它给了我一个SQL错误和不明确的引用

如果有人知道另一种方法或看到条款中有某种错误,请告诉我


谢谢

我认为主要问题在于,您选择的是case语句为每个id返回的最大值,而不是CAS语句为最大日期返回的值。因此,这些值的顺序是准时CAD、非物理、超过10天…、少于3天…、交付、6天…、3天。因此,如果所有这些id都有一个ship_evnt_tms为空的记录,那么该情况下产生的最大值将超过10天。。。。同样奇怪的是,您将distinct与聚合一起使用。相反,您可以根据po_id进行分组。或许可以尝试:

select
z.po_id, 
CASE 
  WHEN max(dcus.ship_evnt_tms) is not null then 'Delivered'
  WHEN days(CURRENT_timestamp) - days(max(Z.CAD_TMS)) <= 0 then 'On time CAD'
  WHEN days(CURRENT_timestamp) - days(max(Z.CAD_TMS)) between 1 and 2 then 'Less than 3 days after CAD'
  WHEN days(CURRENT_timestamp) - days(max(Z.CAD_TMS)) between 3 and 5 then 'Between 3 & 5 days after CAD'
  WHEN days(CURRENT_timestamp) - days(max(Z.CAD_TMS)) between 6 and 10 then 'Between 6 & 10 days after CAD'
  WHEN days(CURRENT_timestamp) - days(max(Z.CAD_TMS)) >= 10 then 'More than 10 days after CAD'
  ELSE 'Non physical' 
END AS Aging,

max(z.cad_tms) as cad_tms, 
max(dcus.ship_evnt_tms) as DELV_DATE_CUS

from SCHEMA.TABLE z

left join SCHEMA.TABLE1 A ON z.po_id = a.po_id

left JOIN SCHEMA.TABLE2 scus ON (A.SHIP_ID = scus.SHIP_ID AND A.SHIP_TO_LOC_CODE = scus.SHIP_TO_LOC_CODE and scus.loc_type = 'CUS')

left join SCHEMA.TABLE3 dcus ON (scus.SHIP_ID = dcus.SHIP_ID_856 AND scus.SHIP_TO_LOC_CODE = dcus.SHIP_TO_LOC_CD856 
AND dcus.SHIP_EVNT_CD = 'D')

left JOIN SCHEMA.TABLE2 scdc ON (A.SHIP_ID = scdc.SHIP_ID AND A.SHIP_TO_LOC_CODE = scdc.SHIP_TO_LOC_CODE and scdc.loc_type = 'CDC')

left join SCHEMA.TABLE3 dcdc ON (scdc.SHIP_ID = dcdc.SHIP_ID_856 AND scdc.SHIP_TO_LOC_CODE = dcdc.SHIP_TO_LOC_CD856 
AND dcdc.SHIP_EVNT_CD = 'D')

group by z.po_id

如果我删除CASE子句中的最后一条语句,Update…函数似乎可以工作…已交付的语句将显示,但是大于10的都是NULL,这是逻辑原因,如果我添加最后一个ELSE,例如dcus.ship\u evnt\u tms为NULL,那么“超过10天…”将不起作用…甚至将超过10天的结果直接放在ELSE子句中…非常好的建议!我已经更新了查询并获得了所有正确的信息。我试图通过添加另一个条件来增强查询,即当scdc.ship_event_tms不为空且scdc.ship_to_ctry在'XX'中时,'ZZ'然后是'Delivered BP'。我尝试将其添加到第一个条件下,两个字段都有max,但在老化中没有得到正确的值。是否可以合并第一条,添加ctry条件?谢谢不用担心…我使用了不正确的ship\u evnt\u tms…我需要在SCU的情况下使用scdc…这带来了正确的值。我的工作解决了。谢谢!