2012-12-11 10 views
5

Nie mogę się dowiedzieć, jak to zrobić i nie wiem, jak dokładnie to wyszukać!Zaktualizuj jedną tabelę w oparciu o SUM (wartości) w innej tabeli o wielu kryteriach.

mam tabeli [MASTER]:

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

inna tabela [FOOS]

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

MASTER zawiera jeden wiersz na id/CCY złożony klucz (nie wiem, czy to jest to prawidłowe określenie), np

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 zawiera kilka wierszy i nie zawiera wiersz dla każdej MASTER np

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

Chciałabym uruchomić kwerendę, aby zaktualizować tylko dopasowanie MASTER wiersze z SUM(FOOS.Val). na przykład

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 

... ale chociaż próbowałem numer opcji (where exists, inner join) mogę nie wydaje się być w stanie albo link w pojedynczym MASTER lub wykonaj SUM(...)

+0

Tabela główna zawiera jeden wiersz na ID/CCY. I chcesz zaktualizować Master za pomocą SUM dla dopasowania ID/CCY. Czy to jest poprawne? Dlaczego nie zrobić grupy na ID/CCY na Foo, a następnie zaktualizować Master przy użyciu tego pierwszego zapytania jako zagnieżdżonego zapytania? – bonCodigo

+0

Oto odpowiedź, którą dostarczył Mahmood :) – bonCodigo

Odpowiedz

12

Wypróbuj rozwiązanie:

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

z PostgreSQL, musiałem dostosować rozwiązanie do pracy z tym do mnie:

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; 
Powiązane problemy