2012-04-30 122 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

這是有效的嗎?您似乎正在更新兩次「付款」列。 –

+0

@Siva我正在使用Advantage 9 – Trevor

回答

5

您可以將其簡化爲使用單個查詢而不是兩個查詢。你仍然需要一個,因爲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 yep這就是爲什麼我修復它,看我最後的編輯 –

+0

是的,抱歉,我開始寫評論,然後檢查是100%肯定它是無效的,所以當我真正發佈你已經修復它。您可以通過使用'CASE當'Code_Type IN('AB','CD')'而不是'Code_Type ='AB'或Code_Type ='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; 

兩個左連接是沒有問題的!