2016-05-06 7 views
0

ich die folgenden Tabellen:MERGE -Tabelle Altwert + neuer Wert mit

Tabelle 1:

Id | ClientId | Amount 
------------------------------ 
1 | 100  | 
2 | 130  | 
.. 
9 | 280  | 

Table2: Quelltabelle

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 

usw. die Tabelle tmp aggregiert :

Tabelle3 (tmp):

Tabelle2 ist inkrementelles Laden, für jede CashId in der Tabelle kann Bargeldeinzahlung ein paar Mal auftreten. Für das erste Laden sind 2 Bareinzahlungen für CashId = 1. Für das zweite Laden ist 1 Bareinzahlung für CashId = 1, aber dieses Laden kam am nächsten Tag heraus.

Ich möchte prüfen, ob beim nächsten Laden neue Bareinzahlung kommt. Die Betragsspalte aus Tabelle1 besteht aus Summenangaben aus Preis und Steuern aus Tabelle2 für jede CashId.

Table1.Id = Table2.CashId

Wie nach dem 1. Laden aussehen Table1 sollte:

Id | ClientId | Amount 
------------------------------ 
1 | 100  | 800 
2 | 130  | 370 
... 

nach 2. Laden von Daten:

Id | ClientId | Amount 
------------------------------ 
1 | 100  | 800 + 100 = 900 
2 | 130  | 370 + 29 = 399 
... 

Ich dachte Anweisung wie folgt zu verwenden:

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' 

Ich muss ein neues Total_Sum aus dem neuen Laden zu den vorhandenen Daten in der Amount-Spalte in Table1 hinzufügen. Wenn neue Daten kommen und ich MERGE-Anweisung ausführen, sollte Total_Sum zu vorhandenem Wert in der Amount-Spalte hinzugefügt werden, aber wenn Daten zum ersten Mal kommen, sollte der Null-Wert in der Amount-Spalte ersetzt werden.

Antwort

0

Sie haben ziemlich viel die Syntax:

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; 

Sie könnten dies ändern möchten:

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; 

Dies sollte in Table3 doppelte Werte behandeln.

+0

Ich habe versucht diesen Weg und ich bekomme Fehler: nicht in der Lage, eine stabile Reihe von Zeilen in den Quellentabellen zu erhalten "Eine stabile Reihe von Zeilen konnte nicht wegen großer dml-Aktivität oder einer nicht-deterministischen where-Klausel erhalten werden. – Merix

+0

@Merix - Sie haben gesagt, dass es aggregiert ist, aber sind Sie sicher, dass Sie in Tabelle 3 keine doppelten CashId-Werte haben? –

Verwandte Themen