SQL Select Case Combining

时间:2014-06-16 12:59:48

标签: sql sql-server-2008 case

我有两个选择的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语句中每个选项的子案例语句中。我真的更愿意避免这种情况。我想避免的第二个选项是使用临时表。但是,如果我不能做我在这里尝试的事情,我可能会被迫使用一个。

感谢您的帮助!

3 个答案:

答案 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;