我有两个选择的case语句,我想以某种方式合并在一起。我尝试了不同的嵌套变体,到目前为止,除了错误之外我什么都没得到。我正在使用SQL Server 2008,并希望它尽可能向后兼容SQL 2005,因为我们设置了2005年的第二个实例。
我正在做的是查看帐户的付款次数,并尝试确定它是每周,每两周,每月还是每两个月一次。
根据计划的付款次数,取决于我用于计算付款之间的天数。由于没有真正的每周,每两周等选择,我们会根据首次预定付款与上次预定付款之间的天数除以数量,使用一系列天数。付款。
以下是我的两个案例陈述:第一个给出了付款之间的天数。
case NoPymnts
when 1 then 0
when 2 then (datediff(d, DueDt1, DueDt2)/NoPymnts)
when 3 then (datediff(d, DueDt1, DueDt3)/NoPymnts)
when 4 then (datediff(d, DueDt1, DueDt4)/NoPymnts)
when 5 then (datediff(d, DueDt1, DueDt5)/NoPymnts)
when 6 then (datediff(d, DueDt1, DueDt6)/NoPymnts)
when 7 then (datediff(d, DueDt1, DueDt7)/NoPymnts)
when 8 then (datediff(d, DueDt1, DueDt8)/NoPymnts)
when 9 then (datediff(d, DueDt1, DueDt9)/NoPymnts)
when 10 then (datediff(d, DueDt1, DueDt10)/NoPymnts)
when 11 then (datediff(d, DueDt1, DueDt11)/NoPymnts)
when 12 then (datediff(d, DueDt1, DueDt12)/NoPymnts)
end as DayCount
这个包含决定付款频率的逻辑:
case
when DayCount = 0 then 'SinglePayment'
when DayCount <=7 then 'Weekly'
when DayCount >7 and DayCount <= 21 then 'Bi-Weekly'
when DayCount >21 and Daycount <= 42 then 'Monthly'
when DayCount > 42 then 'Bi-Monthly'
End As Frequency
我知道一个可行的选项,但是大而混乱的是将第二个案例放入第一个case语句中每个选项的子案例语句中。我真的更愿意避免这种情况。我想避免的第二个选项是使用临时表。但是,如果我不能做我在这里尝试的事情,我可能会被迫使用一个。
感谢您的帮助!
答案 0 :(得分:0)
只需将第二种情况下DayCount
的值替换为您在第一种情况下使用的计算,因为您似乎在执行相同的计算而不管NoOfPymts
,但单笔付款除外:
case
when NoPymnts = 1 then 'SinglePayment'
when (datediff(d, DueDt1, DueDt2)/NoPymnts)<=7 then 'Weekly'
when (datediff(d, DueDt1, DueDt2)/NoPymnts)>7
and (datediff(d, DueDt1, DueDt2)/NoPymnts)<= 21 then 'Bi-Weekly'
when (datediff(d, DueDt1, DueDt2)/NoPymnts)>21
and (datediff(d, DueDt1, DueDt2)/NoPymnts)<= 42 then 'Monthly'
when (datediff(d, DueDt1, DueDt2)/NoPymnts)> 42 then 'Bi-Monthly'
End As Frequency
答案 1 :(得分:0)
为第二种情况创建用户定义的函数,如下所示
CREATE FUNCTION GetFrequencyFromDayCount
(
@DayCount INT
)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @Freq NVARCHAR(50)
SELECT @Freq = case
when @DayCount = 0 then 'SinglePayment'
when @DayCount <=7 then 'Weekly'
when @DayCount >7 and @DayCount <= 21 then 'Bi-Weekly'
when @DayCount >21 and @DayCount <= 42 then 'Monthly'
when @DayCount > 42 then 'Bi-Monthly'
End
RETURN @Freq
END
GO
在第一个case语句中调用该函数,如下所示
select
case NoPymnts
when 1 then 0
when 2 then GetFrequencyFromDayCount((datediff(d, DueDt1, DueDt2)/NoPymnts))
when 3 then GetFrequencyFromDayCount((datediff(d, DueDt1, DueDt3)/NoPymnts))
when 4 then GetFrequencyFromDayCount((datediff(d, DueDt1, DueDt4)/NoPymnts))
when 5 then GetFrequencyFromDayCount((datediff(d, DueDt1, DueDt5)/NoPymnts))
when 6 then GetFrequencyFromDayCount((datediff(d, DueDt1, DueDt6)/NoPymnts))
when 7 then GetFrequencyFromDayCount((datediff(d, DueDt1, DueDt7)/NoPymnts))
when 8 then GetFrequencyFromDayCount((datediff(d, DueDt1, DueDt8)/NoPymnts))
when 9 then GetFrequencyFromDayCount((datediff(d, DueDt1, DueDt9)/NoPymnts))
when 10 then GetFrequencyFromDayCount((datediff(d, DueDt1, DueDt10)/NoPymnts))
when 11 then GetFrequencyFromDayCount((datediff(d, DueDt1, DueDt11)/NoPymnts))
when 12 then GetFrequencyFromDayCount((datediff(d, DueDt1, DueDt12)/NoPymnts))
end as DayCount
答案 2 :(得分:0)
您是否只是想找到一种方法来先查找日数,然后再进行构建?然后使用派生表查询:
select
some_column,
other_column,
case
when DayCount = 0 then 'SinglePayment'
when DayCount <=7 then 'Weekly'
when DayCount >7 and DayCount <= 21 then 'Bi-Weekly'
when DayCount >21 and Daycount <= 42 then 'Monthly'
when DayCount > 42 then 'Bi-Monthly'
End As Frequency
from
(
select
some_column,
other_column,
case NoPymnts
when 1 then 0
when 2 then (datediff(d, DueDt1, DueDt2)/NoPymnts)
when 3 then (datediff(d, DueDt1, DueDt3)/NoPymnts)
when 4 then (datediff(d, DueDt1, DueDt4)/NoPymnts)
when 5 then (datediff(d, DueDt1, DueDt5)/NoPymnts)
when 6 then (datediff(d, DueDt1, DueDt6)/NoPymnts)
when 7 then (datediff(d, DueDt1, DueDt7)/NoPymnts)
when 8 then (datediff(d, DueDt1, DueDt8)/NoPymnts)
when 9 then (datediff(d, DueDt1, DueDt9)/NoPymnts)
when 10 then (datediff(d, DueDt1, DueDt10)/NoPymnts)
when 11 then (datediff(d, DueDt1, DueDt11)/NoPymnts)
when 12 then (datediff(d, DueDt1, DueDt12)/NoPymnts)
end as DayCount
from mytable
) myderivedtable;