2013-01-21 55 views
-2

可能重复:
Converting Access Code to SQL结合CASE语句

我使用IIF语句,在1有2个接入码,然后我试图重写他们的SQL作为CASE声明,但我正在发生一些快速颠簸。

Sum(IIf([RRDD] Not Like "12*" 
    And [RRDD] Not Like "13*" 
    And [RRDD] Not Like "16*" 
    And [RRDD] Not Like "17*" 
    And [RRDD] Not Like "2706" 
    And [RRDD] Not Like "2707" 
    And [RRDD] Not Like "2331", 
    CDbl([2011 Total])*IIf(IsNumeric([Dur_In_Hours]), 
    CDbl([Dur_In_Hours]),0),0)) AS SP_DOM_COST 

,其中第一IIF被乘以第二IIF是我很困惑,我需要它是SQL格式

+1

把'(CASE ... WHEN ... END)'乘以另一个'(CASE ... WHEN ... END)'没有什么不对,那么问题是什么? –

+0

我不知道如何在SQL版本中格式化代码,IE第二种情况是部分 – user1958651

回答

1
Sum(case when [RRDD] Not Like '12%' 
And [RRDD] Not Like '13%' 
And [RRDD] Not Like '16%' 
And [RRDD] Not Like '17%' 
And [RRDD] Not Like '2706' 
And [RRDD] Not Like '2707' 
And [RRDD] Not Like '2331' 
then cast([2011 Total] as float) * 
    case when ISNUMERIC([Dur_In_Hours]) = 1 
     then cast([Dur_In_Hours] as float) 
     else 0 
    end 
else 0 
end) AS SP_DOM_COST 

虽然IsNUmeric是一个有效的TSQL功能是apparentlynot verynice to play with。如果您得到奇怪的结果,请查看其他existing解决方法的答案。根据你的数据,你可能会好起来的。

+1

不确定,但可能应将'*'s更改为'%'s。 –

+0

你是对的!谢谢 – Brad

2

您可以简化SQL Server和Access中的逻辑。下面是SQL Server版本:

Sum(case when left([RRDD], 2) not in ('12', '13', '16', '17') and 
       RRDD not in ('2706', '2707', '2331') and 
       isnumeric(dur_in_hours) = 1 
     then [2011 Total] * cast(Dur_In_Hours as float) 
     else 0.0 
    end) AS SP_DOM_COST 

在两个系统中,like是要承担比通过常量列表搜索更多的开销。演员是安全的,因为它在where条款(我还添加了上述参考的答案,因为答案不正确)。

iif的替换通常是case,虽然此功能已被添加到SQL Server 2012中(说,我希望没有人使用它)。