2012-12-11 75 views
5

我似乎无法找到如何做到这一点,并不确定如何搜索它!基于多个标准的另一个表中的SUM(值)更新一个表

我有一个表[MASTER]

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

和另一个表[FOOS]

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

MASTER含有每ID的一行/ CCY复合键(不知道如果那是正确的术语)例如

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包含多行和不包含行每MASTER例如

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

我想运行一个查询只更新与SUM(FOOS.Val)匹配MASTER行。例如

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 

...但尽管我已经试过的选项NUMER(where existsinner join)我似乎无法能够要么链接到一个MASTER还是做SUM(...)

+0

主表每个ID/CCY包含一行。并且您想用SUM更新Master以匹配ID/CCY。那是对的吗?为什么不通过在Foo上的ID/CCY进行分组,然后使用第一个查询作为嵌套查询更新Master? – bonCodigo

+0

马哈茂德为你提供了答案:) – bonCodigo

回答

12

试试这个解决方案:

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

在Postgres,我有这个调整的解决方案,为我工作:

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; 
相关问题