2012-04-30 35 views
6

Tôi tin rằng tôi có thể tối ưu hóa câu lệnh sql này bằng cách sử dụng một tuyên bố trường hợp cho các Kết nối bên ngoài Trái.Câu lệnh SQL tối ưu hóa Trường hợp

Nhưng tôi đã gặp khó khăn trong việc thiết lập các trường hợp, một để tổng hợp các loại mã AB, CD và một cho tất cả các phần còn lại.

Đánh giá cao bất kỳ trợ giúp hoặc mẹo nào bạn có thể cho tôi về điều này.

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

Điều này có hợp lệ không? Dường như bạn đang cập nhật cột 'thanh toán' hai lần. –

+0

@Siva Tôi đang sử dụng Advantage 9 – Trevor

Trả lời

5

Bạn có thể đơn giản hóa việc này để sử dụng một truy vấn duy nhất thay vì hai truy vấn. Bạn vẫn cần một vì GROUP BY trong một UPDATE không hoạt động.

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

Đây không phải là cú pháp hợp lệ. Bạn không thể có hàm tổng hợp trực tiếp trong danh sách được đặt. – GarethD

+0

@GarethD yep đó là lý do tại sao tôi sửa nó, xem chỉnh sửa cuối cùng của tôi –

+0

Vâng, xin lỗi, tôi bắt đầu viết bình luận, sau đó kiểm tra là chắc chắn 100% nó không hợp lệ, vì vậy vào thời điểm tôi đăng bạn đã sửa nó . Bạn có thể cải thiện điều này bằng cách sử dụng 'CASE WHEN Code_Type IN ('AB', 'CD')' Thay vì 'Code_Type = 'AB' HOẶC Code_Type = 'CD'' – GarethD

1

Có lẽ một cái gì đó như thế này:

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; 

Hai trái tham gia không phải là một vấn đề!

Các vấn đề liên quan