2016-07-08 8 views
6

Ich habe diese Tabellenstruktur für Waagen Tabelle:Wie kann ich diese Abfrage rekursiv Sql Server machen?

enter image description here

Und dies ist die Ansicht:

enter image description here

Ich habe auch diese Struktur für Beträge Tabelle:

enter image description here

Th der Ansichtsmodus für Beträge Tabelle ist:

enter image description here

Zunächst einmal muss ich die Menge Wert für einen bestimmten Tag in Mengen Tabelle erhalten:

enter image description here

mit dieser Abfrage ich der Betrag 300 in Datum 07/07/2016. Sobald diese Zahl erreicht ist, muss ich eine rekursive Abfrage mit Balances-Tabelle machen. Das Endergebnis sollte wie folgt sein:

Name abstractAmount addAmount Balance 
    ----- -------------- --------- ------- 
    Josep      100  400  
    Maria  50      350 
    George      60   410 
    Julianne 25      385 

was ist das? Dieses Ergebnis wird erreicht, indem der 300 aus der Tabelle Beträge genommen wird, und für jede Zeile in der Tabelle Ausgleich sehe ich: Wenn der abstracAmount in der ersten Zeile nicht leer ist, mache ich diese mathematische Berechnung: balance = (300 - abstractAmount), falls ist leer und die Spalte addAmount hat Werte, die ich diesen mathematischen Berechnungssaldo = (300 + addAmount) mache Im Rest der Zeilen mache ich das gleiche, aber die Berechnung ist nicht auf 300, ist auf der letzten Zeile Balance: Zum Beispiel: In der ersten Zeile ist der Saldo 400, da der Addount einen Wert hat, also mache ich diese Berechnung: 300 + 100 = 400 In der zweiten Zeile ist der Saldo 350, da der abstractAmount nicht leer ist, also nehme ich den Saldowert für die letzte Zeile und Machen Sie diese Berechnung: 400 - 50 = 350. Und das gleiche für den Rest der Reihen, nimmt nur die erste Reihe den Ball Wert für die Tabelle der Beträge.

Hinweise:
1. Immer die Spalte abstractAmount Werte subtrahiert, und die addAmount Spaltensummenwerte.

  1. Immer eine dieser Spalten (abstractAmount | addAmount) ist leer.

  2. Nur die erste Zeile nimmt den Wert, um die mathematische Berechnung für die Tabelle Amounts, der Rest der Zeilen nimmt den Wert für die Zeile vor.

Wie kann ich dieses Endergebnis zu bekommen? :

 Name  abstractAmount addAmount Balance 
     ----- -------------- --------- ------- 
     Josep      100  400  
     Maria  50      350 
     George      60   410 
     Julianne 25      385 

Ich nehme Vorschläge an, danke.

Antwort

3

Anstelle der Rekursion können Sie Fensterfunktionen verwenden.Insbesondere eine Summe über rows unbounded preceding eine laufende Summe (+ den Start Balance) zu erhalten:

select *,300 + sum(isnull(addAmount,0) - ISNULL(abstractAmount,0)) over (order by id rows unbounded preceding) Balance 
from Balances 

Die isnull(addAmount,0) - ISNULL(abstractAmount,0) ist einfach die Mutation für jede Zeile. Der Bereich legt die Summe auf die aktuelle Zeile und alle vorhergehenden Zeilen gemäß ID fest.

Um die Basis aus der Tabelle Mengen zu erhalten, können Sie einfach die (wählen Sie ... wo Datum ..) als Wert anstelle von '300' oder ein bisschen geschickter: mit einem Kreuz Join zu den Mengen Tabelle:

select b.*, a.dateInsertion,a.amount, a.amount + sum(isnull(addAmount,0) - ISNULL(abstractAmount,0)) over (order by b.id rows unbounded preceding) Balance 
from Balances b 
cross join Amounts a 
where a.dateInsertion = '20160707' 

mit dem Kreuz verbinden, ohne die where, würden Sie alle möglichen Salden

+0

Ist posible erhalten auf diese Abfrage eine andere Abfrage hinzuzufügen, um den Mengenwert (300) für die Beträge Tisch zu bekommen ?? –

+1

Sicher Ding, hinzugefügt ein Beispiel in der Bearbeitung –

+1

Ich bin beeindruckt, Ihre Antwort scheint sehr klar und einfach zu verstehen, ich dachte, ich musste etwas komplexer, vielen Dank für Ihre Hilfe. –