2012-04-30 10 views
6

左外部結合のcaseステートメントを使用してこのSQLステートメントを最適化できると思います。SQL最適化のケースステートメント

しかし、私は、コードタイプAB、CD、およびその他すべてをまとめたケースを設定するのに苦労しています。

私にこれについて教えていただけるお手伝いをお待ちしております。たぶん

update billing set payments = isnull(bd1.amount, payments) 
, payments = case 
     when payments is null then 0 
     else payments 
    end 
, charges = case 
     when bd2.amount is not null then charges 
     when charges is null then 0 
     else charges 
     end 
, balance = round(charges + isnull(bd1.amount, bi.payments), 2) 
from billing bi 

left outer join (select inv, round(sum(bd1.bal), 2) amount 
       from "bill" bd1 
       where code_type = 'AB' 
       or code_type = 'CD' 
       group by inv) bd1 
       on bd1.inv = bi.inv 
left outer join (select invoice, round(sum(bd2.bal), 2) amount 
       from "bill" bd2 
       where code_type <> 'AB' 
       and code_type <> 'CD' 
       group by inv) bd2 
       on bd2.inv = bi.inv; 
+3

これは有効ですか?あなたは 'payments'列を2回更新しているようです。 –

+0

@Siva Advantage 9を使用しています – Trevor

答えて

5

2つではなく1つのクエリを使用すると、これを簡略化できます。 UPDATEのGROUP BYが機能しないため、これも必要です。

UPDATE bi 
SET payments = bd.payments, 
     charges= bd.charges, 
     balance = bd.balance 
FROM billing bi 
     LEFT JOIN (SELECT bd.inv, 
         payments = Round(Sum(CASE 
               WHEN code_type IN ('AB' , 'CD') THEN 
               bd.bal 
               ELSE 0 
               END), 2), 
         charges = Round(Sum(CASE 
               WHEN code_type NOT IN ('AB' , 'CD') THEN 
               bd.bal 
               ELSE 0 
              END), 2), 
         balance = Round(Sum(bd.bal), 2) 
        FROM bill bd 
        GROUP BY bd.inv) bd 
     ON bd.inv = bi.inv 
+0

これは有効な構文ではありません。集合リストに集合関数を直接入れることはできません。 – GarethD

+0

@GarethDそれは私がそれを修正した理由、私の最後の編集を参照してください –

+0

ええ、申し訳ありません、私はコメントを書いて、その後100%有効ではないことを確かめることを確認したので、 。 'Code_Type = 'AB'またはCode_Type = 'CD''よりむしろ' CASE WHEN Code_Type IN(' AB '、' CD ') 'を使用することでさらに改善することができます。 – GarethD

1

このような何か:

update billing set payments = isnull(bd1.amount, payments) 
, payments = isnull(payments, 0) 
, charges = isnull(bd2.amount, isnull(charges, 0)) 
, balance = round(charges + isnull(bd1.amount, bi.payments), 2) 
from billing bi 

left outer join (select inv, round(sum(bd1.bal), 2) amount 
       from "bill" bd1 
       where code_type in ('AB', 'CD') 
       group by inv) bd1 
       on bd1.inv = bi.inv 
left outer join (select invoice, round(sum(bd2.bal), 2) amount 
       from "bill" bd2 
       where code_type not in ('AB', 'CD') 
       group by inv) bd2 
       on bd2.inv = bi.inv; 

2つの左の結合問題ではありません!