3

レポートのデータをプルする大規模なストアドプロシージャがあります。WHERE特定の基準に応じて、句で2つの異なる値のいずれかを使用しようとしています。CASEステートメントを使用してこれを実行する方法がわかりませんTHEN。パーツでエラーが発生し続けます。以下は私がやろうとしていることです。これは、より大きなストアドプロシージャのごく一部です。したがって、私が探しているのは、 andパラメータで評価するために使用したいdlp(DATETIME)よりも新しい場所です。そうでない場合は、andで評価するために使用します。dlc(DATETIME)dlp@AgeStart@AgeEnddlc@AgeStart@AgeEnd

@AgeStart INT
@AgeEnd INT

SET @Recovery = (
SELECT SUM(ISNULL(M.Paid1, 0))
FROM Master AS M
WHERE M.Status IN ('xxx','yyy')
  AND CASE
    WHEN COALESCE(M.dlp, '2000-01-01 00:00:00') > 
         COALESCE(M.dlc, '2000-01-01 00:00:00') 
    THEN DATEDIFF(dd,M.Received,M.dlp) 
      >= @AgeStart AND DATEDIFF(dd,M.Received,M.dlp) <= @AgeEnd
    ELSE DATEDIFF(dd, M.dlc, M.Received) 
      >= @AgeStart AND DATEDIFF(dd, M.dlc, M.Received) <= @AgeEnd
  END
  AND M.Balance >= @OrigBalanceMin AND M.Balance <= @OrigBalanceMax
)
4

1 に答える 1

1

case ステートメントは必要ありません。括弧でネストしてOR条件を使用するだけです。私はすべての括弧を並べたと思います:

WHERE M.Status IN ('xxx','yyy')
    AND 
    /* Your updated case statement starts here */
    (
        (
            COALESCE(M.dlp, '2000-01-01 00:00:00') > 
                COALESCE(M.dlc, '2000-01-01 00:00:00') AND 
            DATEDIFF(dd,M.Received,M.dlp) >= @AgeStart AND 
                DATEDIFF(dd,M.Received,M.dlp) <= @AgeEnd
        ) OR (
            COALESCE(M.dlp, '2000-01-01 00:00:00') <= 
                COALESCE(M.dlc, '2000-01-01 00:00:00') AND 
            DATEDIFF(dd, M.dlc, M.Received) >= @AgeStart AND 
                DATEDIFF(dd, M.dlc, M.Received) <= @AgeEnd
        )
    )
    /* Your updated case statement ends here */
    AND M.Balance >= @OrigBalanceMin AND M.Balance <= @OrigBalanceMax
)
于 2012-09-11T13:54:01.860 に答える