Ich habe ein Problem, dass es sehr einfach ist, in C# -Code zum Beispiel gelöst zu werden, aber ich habe keine Ahnung, wie man in einer SQL-Abfrage mit rekursiven CTE-s oder Sliding schreibt Windows-Funktionen HierSQL-Implementierung mit Sliding-Window-Funktionen oder rekursive CTEs
ist die Situation: sagen wir, ich habe eine Tabelle mit drei Spalten (ID, Date, Amount
), und hier einige Daten:
ID Date Amount
-----------------------
1 01.01.2016 -500
2 01.02.2016 1000
3 01.03.2016 -200
4 01.04.2016 300
5 01.05.2016 500
6 01.06.2016 1000
7 01.07.2016 -100
8 01.08.2016 200
Das Ergebnis, das ich vom Tisch bekommen wollen, ist dies (ID, Amount .... Order By Date
):
ID Amount
-----------------------
2 300
4 300
5 500
6 900
8 200
die Idee ist, die Beträge in Raten zu verteilen, separat für jeden Kunden, aber die Sache ist, wenn negative Menge Spiel kommt in Sie Betrag von der letzten Rate entfernen müssen. Ich weiß nicht, wie klar ich bin, also hier ein Beispiel:
Angenommen, ich habe 3 Rechnungen für einen Kunden mit den Beträgen 500, 200, -300.
Wenn ich anfange, diese Rechnungen zu verteilen, verteile ich zuerst den Betrag 500, dann 200. Aber wenn ich zum dritten -300 komme, dann muss ich von der letzten Rechnung entfernen. Mit anderen Worten 200 - 300 = -100, so dass der Betrag aus der zweiten Rechnung verschwindet, aber immer noch -100, die von der ersten Rechnung abgezogen werden müssen. Also 500 - 100 = 400. Das Ergebnis, das ich brauche, ist das Ergebnis mit einer Zeile (erste Rechnung mit Betrag 400)
Ein anderes Beispiel, wenn die erste Rechnung mit einem negativen Betrag (-500, 300, 500) ist. In diesem Fall wird die zweite (-500) Rechnung die zweite verschwinden lassen und weitere 200 werden von der dritten abgezogen. Also das Ergebnis wird: Dritte Rechnung mit Betrag 300.
Dies ist so etwas wie Stack-Implementierung in der Programmiersprache, aber ich muss es mit Sliding-Window-Funktionen in SQL Server machen.
Ich brauche eine Implementierung mit Gleitfunktion oder rekursive CTEs. Nicht mit Zyklen ...
Danke.
... Es gibt keine Client-ID für Ihre Daten ...und ich verstehe es nicht, warum Sie eine Id von einer Reihe mit einer reduzierten Menge darauf wollen. ein siple sum() über die gruppierte by clientid reicht nicht aus? –
Bei ID 2, die ich nehme, habe ich nur Eingänge von -500 und 1000, wie bekommen Sie 300 ??? Willst du nur die Gesamtsumme im Laufe der Zeit? Ihre Textbeispiele scheinen darauf hinzudeuten, dass Sie nur die Zahlen hinzufügen möchten. Wenn das wirklich für Rechnungen ist, müssen Sie Ihre Beispieldaten verbessern, um sie zu zeigen –
Die reale Menge von 2 ist 1000, aber die tatsächliche sollte 1000 (2) -500 (1) -200 (3) = 300 sein Das Negative Beträge müssen von den Beträgen abgezogen werden, die vor ihnen liegen, aber in diesem Fall ist der erste Betrag negativ, und er muss vom ersten positiven Wert abgezogen werden, der danach kommt. –