引用相同的 SQL 列以在 CASE 子句中使用
Reference same SQL column to use in CASE clause
我需要一些关于使用 QMF for Qrkstation 在 DB2 中进行 SQL 查询的帮助 z/OS
V11.1 修复包 3。
我正在查询来自不同 table 的几个字段。我也显示了一些时间戳。我需要一个使用这些时间戳之一的 CASE 子句。
想法是其中一个时间戳可以有数据或没有数据(空),因为我正在使用 LEFT JOIN 和那个 table(如果值则带上它,如果没有则为空)所以 CASE 子句会需要检查 column/field 并且如果它有数据(IS NOT NULL)然后输入值 '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 语句,最后的记录显示正确的计算和结果。
我尝试删除 table 别名 (dcus) 以便 "reference" 到列值本身,但它给了我一个 SQL 错误(模糊引用)
如果有人知道不同的方法或发现条款中的某种错误,请告诉我。
谢谢!!
我认为主要问题是您选择的是 case 语句为每个 id 返回的最大值,而不是 CAS 语句的最大日期值。所以这些值的顺序是(准时加元、非实物、超过 10 天...、少于 3 天...、已交付、6 日之间...、3 日之间)。因此,如果所有这些 id 都有一条记录,其中 ship_evnt_tms
为空,则该情况下的最大 vbalue 将为 More than 10 days...
。您使用 distinct with aggregation 也很奇怪。相反,您可以在 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
我需要一些关于使用 QMF for Qrkstation 在 DB2 中进行 SQL 查询的帮助 z/OS V11.1 修复包 3。
我正在查询来自不同 table 的几个字段。我也显示了一些时间戳。我需要一个使用这些时间戳之一的 CASE 子句。
想法是其中一个时间戳可以有数据或没有数据(空),因为我正在使用 LEFT JOIN 和那个 table(如果值则带上它,如果没有则为空)所以 CASE 子句会需要检查 column/field 并且如果它有数据(IS NOT NULL)然后输入值 '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 语句,最后的记录显示正确的计算和结果。
我尝试删除 table 别名 (dcus) 以便 "reference" 到列值本身,但它给了我一个 SQL 错误(模糊引用)
如果有人知道不同的方法或发现条款中的某种错误,请告诉我。
谢谢!!
我认为主要问题是您选择的是 case 语句为每个 id 返回的最大值,而不是 CAS 语句的最大日期值。所以这些值的顺序是(准时加元、非实物、超过 10 天...、少于 3 天...、已交付、6 日之间...、3 日之间)。因此,如果所有这些 id 都有一条记录,其中 ship_evnt_tms
为空,则该情况下的最大 vbalue 将为 More than 10 days...
。您使用 distinct with aggregation 也很奇怪。相反,您可以在 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