-2

重複の可能性:
アクセス コードを SQL に変換する

2 in 1 のステートメントを使用するアクセス コードがあり、IIFそれらを 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

最初のIIFIIF が 2 番目の IIF で乗算されている場所は、私が混乱している場所であり、SQL 形式にする必要があります。

4

2 に答える 2

2

SQLServerとAccessの両方でロジックを簡素化できます。SQLServerのバージョンは次のとおりです。

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句に含まれているので安全です(答えが正しくないため、上記の参照にも答えを追加しています)。

この関数はSQLServer2012に追加されていますが、の代わりに使用するのiifが一般的ですcase(つまり、誰も使用しないことを願っています)。

于 2013-01-21T21:59:29.027 に答える
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関数ですが、で遊ぶのは明らか にあまり 良くありません。奇妙な結果が得られた場合は、回避策として他の既存の回答を確認してください。ただし、データによっては問題ない場合があります。

于 2013-01-21T21:25:08.800 に答える