首页 > 解决方案 > 使用不在连接中的表中的数据时的 CASE

问题描述

我要做的是检查不同的表(在不同的服务器上)是否具有与 ETA 到期时的月份的汇率相关的数据。

这是代码:

SELECT distinct 
case when month(pod_eta)>month(getdate()) AND month(max(server.database.[dbo].[CustomsExchangeRate].validto))> month(getdate()) then pod_eta 
    when month(pod_eta)>month(getdate()) AND month(max(server.database.[dbo].[CustomsExchangeRate].validto))= month(getdate()) THEN NULL
    ELSE pod_eta end AS ArrDate from staging.dutydata i

它的逻辑是当ETA是下个月并且我们有下个月的汇率时,然后使用ETA,如果ETA是下个月并且我们有本月的汇率,则为null,否则使用pod_eta(如果ETA是这个月,我们有这个月的汇率)

MSSQL 失败,因为它无法绑定 server.database.dbo].CustomsExchangeRate].validto。

他们没有我可以用来加入他们的通用密钥...

标签: sqlsql-server

解决方案


只需将其拉入变量即可。

DECLARE @maxMonth int;

SELECT @maxMonth = DATEPART(month,max(validto))
  FROM server.database.[dbo].[CustomsExchangeRate];

SELECT distinct 
case when month(pod_eta)>month(getdate()) AND @maxMonth > month(getdate()) then pod_eta 
     when month(pod_eta)>month(getdate()) AND @maxMonth = month(getdate()) THEN NULL
     ELSE pod_eta end AS ArrDate 
from staging.dutydata i;

虽然这对我来说似乎很危险。当它是 12 月并且最大有效日期是下一个 1 月时会发生什么?


推荐阅读