SQL嵌套案例选择执行日期操作

时间:2014-07-17 20:12:33

标签: sql case

我正在尝试根据2个案例选择生成付款日期。 第一种是确定付款时间表,第二种是确定付款日期/日期。

我也加入了2个表,第一个包含实际记录,第二个包含付款计划。他们都是由客户#。

加入

到目前为止,这是我的代码:

Select comp, cust, data.inv, dat, amt, rel.PaymentSchedule, rel.PaymentDay, 
case rel.PaymentSchedule when 'BiMonthly' then 
    case rel.PaymentDay when '1' then DATEADD(MM, 2, dat)  end
    else 
    case rel.PaymentDay when '2' then DATEADD(MM, 2, dat) end 
else if 
    rel.PaymentSchedule when 'Daily' then 
    case rel.PaymentDay when '30' then DATEADD(MM, 1, dat)  end
    else 
    case rel.PaymentDay when '47' then DATEADD(dd, 47, dat) end 

end as PayDate  


from 
(
select b.ASCOMP as comp, b.ASCUST as cust, b.ASINV# as inv, b.ASIDAT as dat, b.ASINAM as amt
from SOLARSOFT.BNDSYS02.IVPDAT.AROHT a
right JOIN SOLARSOFT.BNDSYS02.IVPDAT.AROP b 
    on a.ASINV# = b.ASINV# 
where 
    a.ASINV# is null 
) as data
inner join tbl_payRel rel on cust = rel.Customer#
where 
    (inv not like 'D%')
    and ( inv not like 'P%')
and (cust <> 1308)
and  (cust <> 1067)
and ( cust <> 1295)

order by rel.PaymentSchedule, rel.PaymentDay, cust

问题: 消息156,第15级,状态1,第7行 关键字'else'附近的语法不正确。 消息4145,第15级,状态1,第8行 在预期条件的上下文中指定的非布尔类型的表达式,在'when'附近。 信息156,第15级,状态1,第24行 关键字'as'附近的语法不正确。

我哪里出错了?一整天都在努力工作!

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

专注于此片段:

case rel.PaymentSchedule when 'BiMonthly' then 
case rel.PaymentDay when '1' then DATEADD(MM, 2, dat)  end
else 
case rel.PaymentDay when '2' then DATEADD(MM, 2, dat) end 
else if 
rel.PaymentSchedule when 'Daily' then 
case rel.PaymentDay when '30' then DATEADD(MM, 1, dat)  end
else 
case rel.PaymentDay when '47' then DATEADD(dd, 47, dat) end 

end as PayDate  

只是一两条评论......前两个评论相同,是故意的吗?为什么将这个嵌套为两个案例?这可以是一个声明:

case rel.paymentday 
  when '1' then DATEADD(MM, 2, dat) 
  when '2' then DATEADD(MM, 2, dat)
  when '30' then DATEADD(MM, 1, dat)
  when '47' then DATEADD(dd, 47, dat)
end as PayDate  

您不需要结束每个案例陈述......他们可以根据需要评估多个案例。当我无法记住手边的语法时,我使用微软的这个参考: http://msdn.microsoft.com/en-us/library/ms181765.aspx

我应该添加......如果你想要,你仍然可以嵌套......

case rel.PaymentSchedule 
   when 'BiMonthly' then 
   case rel.PaymentDay  when 1 then DATEADD(MM, 2, dat)
                        when 2 then DATEADD(MM, 2, dat)
   end 
   when 'Daily' then
   case rel.PaymentDay  when '30' then DATEADD(MM, 1, dat)
                        when '47' then DATEADD(dd, 47, dat)
   end
end