1

こんにちは、おそらくコードを複雑にしすぎているので、より良い方法を探しています。

請求書テーブルがあり、2 つの日付範囲を比較しています。日付が範囲 1 にあることを確認する単純な SQL ステートメントを探しています。ordertotal1 に追加します。そうでない場合は、日付範囲 2 に追加します。

これは私の試みです

    SELECT     CUST_CODE,

    CASE
        WHEN  ORDER_DATE >= CONVERT(DATETIME, '2011-01-01 00:00:00', 102) AND ORDER_DATE <= CONVERT(DATETIME, '2011-07-31 23:59:59', 102) THEN  SUM(INV_AMOUNT) AS OrderTotal, SUM(PAID_AMT) AS paidTotal
WHEN  ORDER_DATE >= CONVERT(DATETIME, '2012-01-01 00:00:00', 102) AND ORDER_DATE <= CONVERT(DATETIME, '2012-07-31 23:59:59', 102)  THEN SUM(INV_AMOUNT) AS OrderTotal2, SUM(PAID_AMT) AS paidTotal2
    END
    FROM         INVOICES
    WHERE (STATUS = 9)
    GROUP BY CUST_CODE

もちろん、これは本当に間違っており、多くのエラーが発生します。それを達成するために、php でいくつかのクエリを実行する運命にあると思いますが、過去に上記のようなことをしたことを覚えていると確信しています。

参考までに:Windows用のApache 2.2でphp 5 Mssql 2000を実行しています(選択によるものではありません)。

提供されたヘルプに感謝します

4

3 に答える 3

1

あなたのCASE声明には次のものが欠けているようENDです:

SELECT CUST_CODE,
    CASE
        WHEN  ORDER_DATE >= CONVERT(DATETIME, '2011-01-01 00:00:00', 102) 
            AND ORDER_DATE <= CONVERT(DATETIME, '2011-07-31 23:59:59', 102) 
        THEN  SUM(INV_AMOUNT) END AS OrderTotal, 
        SUM(PAID_AMT) AS paidTotal,
    CASE
        WHEN  ORDER_DATE >= CONVERT(DATETIME, '2012-01-01 00:00:00', 102) 
            AND ORDER_DATE <= CONVERT(DATETIME, '2012-07-31 23:59:59', 102)  
        THEN SUM(INV_AMOUNT) END AS OrderTotal2 
    ---SUM(PAID_AMT) AS paidTotal2 not needed
FROM         INVOICES
WHERE (STATUS = 9)
GROUP BY CUST_CODE

またはさらに良い:

SELECT CUST_CODE,
    SUM(
        CASE
        WHEN  ORDER_DATE >= CONVERT(DATETIME, '2011-01-01 00:00:00', 102) 
            AND ORDER_DATE <= CONVERT(DATETIME, '2011-07-31 23:59:59', 102) 
        THEN  INV_AMOUNT END) AS OrderTotal, 
        SUM(PAID_AMT) AS paidTotal,
    SUM(
        CASE
        WHEN  ORDER_DATE >= CONVERT(DATETIME, '2012-01-01 00:00:00', 102) 
            AND ORDER_DATE <= CONVERT(DATETIME, '2012-07-31 23:59:59', 102)  
        THEN INV_AMOUNT END ) AS OrderTotal2 
    ---SUM(PAID_AMT) AS paidTotal2 not needed
FROM         INVOICES
WHERE (STATUS = 9)
GROUP BY CUST_CODE
于 2012-08-28T16:44:16.703 に答える
0

ORDER_DATE のデータ型は正確には何ですか? CAST を使用しない理由:

cast('2011-01-01 00:00:00' as DATETIME)

とにかく、これを 2 つの CASE 句として使用します。

case
    when ORDER_DATE between cast('2011-01-01 00:00:00' as datetime) and cast('2011-07-31 23:59:59' as datetime)
    then...
end

残りは、単純化されているため、bluefeet のクエリを使用できます。

于 2012-08-28T16:59:02.540 に答える
0

で2列を使用することはできませんCASE WHEN ... THEN THEN SUM(INV_AMOUNT) AS OrderTotal, SUM(PAID_AMT) AS paidTotal

あなたの質問をよく理解している場合は、INV_AMOUNT を OrderTotal と OrderTotal2 の 2 つの値に分割するソリューションが必要です。2011 年の値と 2012 年の値を別々に知りたい場合は、次のようなものが必要です。

 SELECT CUST_CODE,
        SUM(CASE
            WHEN  ORDER_DATE >= CONVERT(DATETIME, '2011-01-01 00:00:00', 102) 
                AND ORDER_DATE <= CONVERT(DATETIME, '2011-07-31 23:59:59', 102) 
            THEN  INV_AMOUNT ELSE 0 END) AS OrderTotal, 
            SUM(PAID_AMT) AS paidTotal,
        SUM(CASE
            WHEN  ORDER_DATE >= CONVERT(DATETIME, '2012-01-01 00:00:00', 102) 
                AND ORDER_DATE <= CONVERT(DATETIME, '2012-07-31 23:59:59', 102)  
            THEN INV_AMOUNT ELSE 0 END) AS OrderTotal2, 
        SUM(PAID_AMT) AS paidTotal2
    FROM         INVOICES
    WHERE (STATUS = 9)
    GROUP BY CUST_CODE
于 2012-08-28T16:59:13.683 に答える