gezielt Leerzeilen in JOIN ausgeben

ukulele

Datenbank-Guru
Beiträge
5.107
Ich habe eine Tabelle mit Buchungssätzen (Im wesentlichen Datum, Konto, Umsatz, Buchungsnummer, Buchungstext). Wer sich irgendwann mal mit Buchhaltung beschäftigt hat müsste wissen das bei doppelter Buchführung zu jeder Buchung auch eine Gegenbuchung auf ein Gegenkonto erfolgt. Leider ist diese Zuordnung in meinen Daten von mir erst wieder mühsam erstellt worden und kann bedeuten, das eine Buchund auf Konto x1 sich durch 2 Buchungen auf Konto y1 und y2 erst ausgleicht.

Jetzt möchte ich das ganze anschaulich in Excel aufbereiten aber ohne großen, manuellen Aufwand. Das heist ich muss bei meiner Abfrage für meinen Buchungssatz 2 Zeilen etwa so ausgeben:

Datum Konto Betrag Gegenkonto Betrag
09.06.2012 1000 -119,00 3400 100,00
1776 19,00

Da alle Informationen aus einer Tabelle stammen und über einen Schlüssel identifieziert werden muss ich im Enteffekt aus einer Abfrage mit drei Zeilen in dieser Tabelle einen JOIN der Tabelle mit sich selbst und zwei Zeilen Ergebnis machen. Irgendwelche Ideen wie ich auf meine Wunschausgabe komme?
 
Werbung:
Hy,

die Datensätze müssen doch irgendwie zusammenhängen. Hast du eine Tabellendefinition?

Und wie du sicher weißt, kannst du die Tabelle mit sich selbst mittels "LEFT" oder "RIGHT" JOIN miteinander verbinden und so ALLE Buchungen finden, welche am Gegenkonto noch KEINE Buchung aufweisen.

Lg
 
In meinem Beispiel gibt es drei Einträge in meine Buchungstabelle die zusammen einen Buchungssatz ergeben. -119 € auf dem Konto 1000 (Kasse) und als Gegenbuchungen 100 € auf Kto 3400 (Wareneingang) und 19 € auf 1776 (Vorsteuer 19%). Es ist also ein Buchungssatz den ich gerne wie oben dargestellt ausgeben möchte mit Konto / Gegenkonto, nur das halt alles in einer Tabelle steht und von mir mit einem UNIQUE IDENTIFIER als "zusammenhängend" markiert ist.

Auf der Seite Konto stehen immer alle Werte eines Buchungssatzes die auf das Konto gebucht wurden, das ich grade "betrachten" möchte. Also ich gucke auf Konto 1000 und sehe bei Konto alle Werte die auf 1000 gebucht wurden (das können mehr auch als einer sein innerhalb eines Buchungssatzes) und auf der Seite der Gegenkonten sehe ich mind. eine, meist zwei oder mehr Buchungen die nicht die KtoNr 1000 haben.

Mein Ziel ist jetzt eine optisch übersichtliche Aufbereitung. Dazu darf aber jeder Wert nur einmal angezeigt werden und es muss mehere Zeilen auf beiden Seiten geben können. In dem Beispiel sollte es eigentlich so aussehen:

Kontoblatt 1000
Datum____Kto__Betrag__Gegenkto_Betrag__Summe
09.06.2012_1000_-119,00__3400____100,00
____________________1776_____19,00__0,00

So ist meine Tabelle aufgebaut:
Code:
CREATE TABLE [dbo].[b](
    [pk] [uniqueidentifier] NULL,
    [buchungs_nr] [varchar](10) NULL,
    [buchungs_datum] [datetime] NULL,
    [buchungs_belegnr] [varchar](20) NULL,
    [buchungs_text] [varchar](50) NULL,
    [konto_nr] [int] NULL,
    [konto_umsatz_s] [money] NULL,
    [konto_umsatz_h] [money] NULL,
    [bk] [uniqueidentifier] NULL
)
Der bk ist bei zusammenhängenden Buchungen der selbe, der pk ist immer eindeutig.
 
Hy,

woher weißt du, was deine "ERSTE" Buchung ist? Ich nheme mal an, am "min(buchungs_datum)".

Muss dies in einer VIEW so optiscvh passen oder in einer Oberfläche?
In einer GUI kannst du dies mit 2 Abfragen lösen und eine RICHTIGE Gruppierung machen.


z.B.:
1. Buchung auf Konto 1000 --Tabellenzeile1
Buchung 1 auf Gegenkonto --Subrow 1
Buchung 2 auf Gegenkonto --Subrow 2
usw....


In der View wüsste ich momentan keine schnelle Lösung.

Lg
 
In welcher Reihenfolge die Buchungen stehen ist mir erstmal egal. Ich gebe eine Ktonr. vor, alle Beträge die auf dieses Kto gebucht werden stehen auf der Linken Seite mit Kontonummer. Alle Beträge die über BK identisch sind und ein anderes Kto haben gehören auf die Gegenkonto Seite.

Mir ist bewusst das es mit GUI schön gehen würde, hab ich aber nicht :) Wollte es in einer View lösen und suche nach einer eleganten Lösung. Im Notfall werde ich 2 Auswertungen fahren und die in Excel zusammen kopieren. Das Problem reizt mich aber.
 
Optimal wäre es einfach wenn ich mich in einem SELECT wie in Excel nicht nur auf Einträge in Spalten der selben Zeile beziehen könnte sondern auch mit der vorhergehenden Zeile vergleichen könnte. Dann hätte ich die Chance einen JOIN zu machen und die doppelten Werte per CASE Anweisung mit NULL zu belegen. Da ich aber keinen Weg kenne mach ich mir jetzt eine Bastellösung.
 
Hey so wie ich dies nun verstehe, ist SQL hier wohl am ENDE.

Aber du bist eh ein Profi in TSQL hier sollte es mit Cursorn relativ leicht realisierbar sein! ;-)

Lg
 
Werbung:
Ich hatte mir erstmal überlegt man könnte die per UNION ALL einen Select machen der leere Zeilen holt und dann Konto und Gegenkonto Spalten joinen, geht auch, ist nur extrem langsam. Wenn man dann noch 0-n Leerzeilen wahlweise beim Konto oder beim Gegenkonto braucht ist es unbrauchbar :)

Ich werde über ein Script eine neue Tabelle schreiben, scheint mir am einfachsten zu sein da sich die Daten auch nicht mehr ändern.
 
Zurück
Oben