2012-12-11 54 views
5

Tôi dường như không thể tìm hiểu cách thực hiện việc này và không chắc chắn chính xác cách tìm kiếm!Cập nhật một bảng dựa trên SUM (giá trị) trong bảng khác trên nhiều tiêu chí

Tôi có một bảng [MASTER]:

ID varchar(6) 
CCY varchar(3) 
Val1 decimal(20,5) 
Val2 decimal(20,5) 
FOO decimal(20,5) 

và một bảng [FOOS]

ID varchar(6) 
CCY varchar(3) 
Val decimal(20,5) 

MASTER chứa một hàng cho mỗi ID/CCY chìa khóa composite (không chắc chắn nếu thats đúng hạn) ví dụ

ABCDEF GBP 200.00 100.00 null 
ABCDEF EUR 400.00 150.00 null 
ZYXWVU GBP 300.00 200.00 null 
ZYXWVU EUR 400.00 200.00 null 

FOOS chứa nhiều hàng và KHÔNG chứa một hàng cho mỗi MASTER ví dụ

ABCDEF GBP 50.00 
ABCDEF GBP 51.00 
ABCDEF GBP 150.00 
ZYXWVU GBP 100.00 
ZYXWVU EUR 200.00 
ZYXWVU EUR 400.00 

Tôi muốn chạy một truy vấn để cập nhật chỉ phù hợp với MASTER hàng với SUM(FOOS.Val). ví dụ.

ABCDEF GBP 200.00 100.00 251.00 
ABCDEF EUR 400.00 150.00 null 
ZYXWVU GBP 300.00 200.00 100.00 
ZYXWVU EUR 400.00 200.00 600.00 

... nhưng mặc dù tôi đã cố gắng một numer của tùy chọn (where exists, inner join) Tôi có thể không có vẻ để có thể một trong hai liên kết đến một đơn MASTER hoặc làm SUM(...)

+0

Bảng chính chứa một hàng cho mỗi ID/CCY. Và bạn muốn cập nhật Chính bằng SUM cho ID/CCY phù hợp. Đúng không? Tại sao bạn không làm một nhóm bằng ID/CCY trên Foo, sau đó cập nhật Master bằng truy vấn đầu tiên đó như một truy vấn lồng nhau? – bonCodigo

+0

Có câu trả lời mà Mahmood đã cung cấp cho bạn :) – bonCodigo

Trả lời

12

Hãy thử điều này giải pháp:

UPDATE m 
SET m.Foo = f.valsum 
FROM [MASTER] m 
INNER JOIN 
(
    SELECT ID, CCY, SUM(val) valsum 
    FROM Foos 
    GROUP BY ID, CCY 
) f ON m.ID = f.ID AND m.CCY = f.CCY; 
4

với postgres, tôi đã phải điều chỉnh các giải pháp với điều này để làm việc cho tôi:

UPDATE [MASTER] m 
SET Foo = f.valsum 
FROM 
(
    SELECT ID, CCY, SUM(val) valsum 
    FROM Foos 
    GROUP BY ID, CCY 
) f 
WHERE m.ID = f.ID AND m.CCY = f.CCY; 
Các vấn đề liên quan