我有以下表格:
表1:
Id | ClientId | Amount
------------------------------
1 | 100 |
2 | 130 |
..
9 | 280 |
表2:源表
Id | CashId | Price | Tax
-----------------------------
1 | 1 | 550 | 120
2 | 1 | 100 | 30
3 | 2 | 320 | 50
4 | 3 | 360 | 100
next data loads
5 | 1 | 80 | 20
6 | 2 | 20 | 9
7 | 4 | 190 | 80
等。 这是聚合到tmp表:
表3(tmp):
Id | CashId | Total_Sum
-----------------------------
1 | 1 | 800
2 | 2 | 370
3 | 3 | 460
next data loads
1 | 1 | 100
2 | 2 | 29
3 | 4 | 270
表2是增量加载,对于表中的每个CashId,现金存款可以发生几次。首次装货是CashId = 1的2现金存款。对于第二次加载是CashId = 1的1现金存款,但是这个加载在第二天出现。
我想检查下次装货是否有新的现金存款。表1中的金额列包含每个CashId的来自表2的价格和税的总和数据。
Table1.Id = Table2.CashId
首次加载后应该如何查看Table1:
Id | ClientId | Amount
------------------------------
1 | 100 | 800
2 | 130 | 370
...
第二次加载数据后:
Id | ClientId | Amount
------------------------------
1 | 100 | 800 + 100 = 900
2 | 130 | 370 + 29 = 399
...
我想用这样的语句:
MERGE INTO Table1 trg
USING (SELECT * FROM Table3) cash
ON trg.Id = cash.CashId
WHEN MATCHED THEN
UPDATE SET trg.Amount = 'trg.Amount + new Total_Sum'
我需要在表1中的Amount列中将新加载的Total_Sum添加到现有数据中。当新数据和我运行MERGE语句时,Total_Sum可以添加到Amount列中的现有值,但是当数据第一次出现时应该在Amount列中替换null值。
答案 0 :(得分:0)
你几乎有语法:
MERGE INTO Table1 trg
USING (SELECT * FROM Table3) cash
ON trg.Id = cash.CashId
WHEN MATCHED THEN
UPDATE SET trg.Amount = trg.Amount + cash.Total_Sum;
您可能希望将其修改为:
MERGE INTO Table1 trg
USING (SELECT cashid, sum(Total_Sum) as Total_Sum
FROM Table3
GROUP BY cashid
) cash
ON trg.Id = cash.CashId
WHEN MATCHED THEN
UPDATE SET trg.Amount = trg.Amount + cash.Total_Sum;
这应该处理Table3
中的重复值。