2

SQL Serverに対して、私は基本的に年初来に基づいて値を計算しようとしているので、2012 年 7 月 16 日以前の値を合計して表示したいと考えています。次のクエリを使用しています (今日の値を計算するために、パラメーターを単純な整数に置き換えたことに注意してください)。

SELECT SUM(CASE 
        WHEN (
            (
                dns.ODAY <= 16
                AND (dns.fiscalyear + 1) = 13
                AND dns.omonth = 7
            )
            OR
               (
                (dns.fiscalyear + 1) = 13
                AND dns.omonth < 7
                )
            )

        THEN dns.QtyShipped
        ELSE 0
        END) AS Shipped_Units

FROM myTable dns

ただし、このクエリはすべての行に対して 0 を返しています。dns.QtyShipped を 1 などの整数に置き換えても、0 が返されます。したがって、case ステートメントが正しく評価されていないことは明らかです。私のロジックに欠陥がありますか?それとも構文の問題ですか (たとえば、もっと括弧が必要です)?

ありがとう!

追加コメント:

テストするために、次のクエリを実行しました。

SELECT SUM(dns.QtyShipped)
FROM myTable dns
where 
                    (dns.ODAY <= 16
                    AND (dns.fiscalyear + 1) = 13
                    AND dns.omonth = 7)

                    OR
                    ((dns.fiscalyear + 1) = 13
                    AND dns.omonth < 7)

これは非常に大きな数を返します。これは紛らわしいです。

4

2 に答える 2

3

先ほどご紹介したコードは問題なく動作しています。条件の評価に使用している値を再確認してください。たとえば、会計年度の値が 2013 か 13 かを確認してください。以下のコードで列名の代わりに変数を使用し、期待される結果を返しました。

declare @ODAY integer
set @ODAY=17
declare @fiscalyear int
set @fiscalyear=12
declare @omonth int 
set @omonth=8

SELECT SUM(CASE 
    WHEN (
        (
            @ODAY <= 16
            AND (@fiscalyear + 1) = 13
            AND @omonth = 7
        )
        OR
           (
            (@fiscalyear + 1) = 13
            AND @omonth < 7
            )
        )

    THEN 1
    ELSE 0
    END) AS Shipped_Units
于 2013-07-17T14:22:31.040 に答える