Kniffelige SQL Frage

Schachigel

Benutzer
Beiträge
13
Hallo Experten!
Entweder das ist total schwierig, oder ich stehe auf der Leitung! Es geht um folgendes:

Eine Tabelle von Buchungen, etwa so:
VertragsID | Datum | Betrag

Alle Verträge in der Tabelle sind "geschlossen" - das heißt die letzte Buchung zu jedem Vertrag gleicht die Summe aller anderer Buchungen aus. Summiert man also die Tabelle, gruppiert nach den VertragsIDs, ergibt das 0 für alle Verträge - das ist nicht sehr nützlich.

Ich hätte also gerne die gleiche Tabelle - jedoch ohne die jeweils letzte Zeile eines Vertrages. Die Anzahl der Einträge in der Tabelle pro Vertrag ist variabel, aber immer größer als 1.
Da ich die Tabelle dann für weitere SQL Statements verwenden will, suche ich eine SQL Lösung - es soll also nicht ausprogrammiert werden.

Ist das möglich?
Freue mich auf Eure Anregungen
HM
 
Werbung:
Bei mehreren Buchungen am selben Tag eventuell ein Problem. Kann SQLite ROW_NUMBEER()?
Code:
WITH t AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY VertragsID ORDER BY Datum DESC) AS zeile,
FROM tabelle )
SELECT *
FROM t
WHERE t.zeile > 1
 
numBEER? Der war gut ;-)

Aber auch damit problematisch wenn mehrere Buchungen am selben Tag, weil diese nicht zu unterscheiden sind.
 
numBEER? Der war gut ;-)

Aber auch damit problematisch wenn mehrere Buchungen am selben Tag, weil diese nicht zu unterscheiden sind.
Es erfüllt aber erstmal die hier genannte Anforderung das nur eine Buchung ("die Letzte") nicht ausgegeben wird. Vielleicht gibt es ja auch noch einen Zeitstempel oder dergleichen. Das mit der letzten Buchung wird aber in der Praxis vermutlich eh nicht klappen, was wenn die vorletzte Buchung ein Zahlungseingang und die letzte Buchung gewährte Skonti sind? Ich denke hier wird man versuchen müssen fakturierte Umsätze zu erkennen und wieviel davon ausgeglichen wurde.
 
Du kannst die Maxima raussuchen und ausfiltern.

Code:
select b.vid, sum(b.bbetrag)
  from buchung b
  join (Select vid, max(bdatum) mxbdatum from buchung group by vid) bm
    on b.vid = bm.vid and b.bdatum< bm.mxbdatum
  group by b.vid
Guter Ansatz! Damit bekommt man (mit der von akretschmer genannten Einschränkung) schon mal die Summen pro Vertrag!
 
Werbung:
Ich hab jetzt auch selbst einen Ansatz gefunden, mit dem ich, wie gewünscht, die gleiche Tabelle bekomme, nur ohne die Abschlussbuchungen. Dazu verwende ich die Tatsache, dass die letzte Buchung der Vertrag auf 0 setzt. Sieht nicht schön aus, hat aber funktioniert:
Zuerst erweitere ich die Tabelle um ein Feld, in dem alle "älteren" Buchungen aufaddiert werden, dann blende ich die Zeilen aus, bei denen diese Summe 0 ist. Mit dem Ergebnis kann man dann allerlei anstellen, etwa die Buchungen pro Vertrag aufsummieren, so dass man den Wert des Vertrages vor der Ablösung bekommt.

Danke an alle, die mitgeholfen haben!

Hier mein SQL:

WITH
temp as (
SELECT
b.vid
, b.Betrag
, (SELECT SUM(Buchungen.Betrag) FROM Buchungen WHERE Buchungen.vid = b.vid AND Buchungen.rowid <= b.rowid) AS Summe
FROM Buchungen AS b
)
/* SELECT * FROM temp */
SELECT * FROM temp WHERE Summe <> 0
 
Zurück
Oben