SELECT FROM LEFT INNER JOIN ON BETWEEN - weiter eingrenzen.

J.Roca

Benutzer
Beiträge
7
Hallo,

es soll eine Hierarchie innerhalb einer Tabelle erstellt werden. Die Hierarchie soll aus der Buchungskontonr und dem Kontoschlüssel erstellt werden.
In der Tabelle stehen die Kontoschlüssel aber nur in den Datensätzen, die anderen übergeordnet sind. Also ungefähr so:
Buchungskontonr; Schlüssel;
0001;
0002;
0003;
0004;
0005; 0003...0005
0006;
0007;
0012; 0004...0012

Die Schlüssel konnte ich beim Import bereits in eine 'Von' und eine 'Bis' Spalte aufteilen.
Mit folgendem SQL Skript können die Schlüssel allen betroffenen Konten zugeordnet werden. Allerdings kommen Datensätze doppelt vor, da
etwa 0004 zu 0005 ubd 0012 zugeordnet werden. Kann das Skript erweitert werden, um bei doppelten Datensätzen nur den niedrigeren Schlüssel zu verwenden, ausser das
Buchungskonto = dem Schlüssel, dann soll der nächsthöhere Datensatz erhalten bleiben. (So wird etwa 0005 gleich 0012 zugeordnet und ergibt eine Hierarchie)

Das Skript:

Code:
SELECT b.[BuchungskontenAlternateKey], b.[Buchungskonten], bh.[BuchungskontenAlternateKey] as KategorieNr
FROM [dbo].[DimBuchungskonten] b  LEFT OUTER JOIN [dbo].[DimBuchungskonten] bh ON (b.[BuchungskontenAlternateKey] BETWEEn bh.[Von] AND bh.Bis)
ORDER BY [BuchungskontenAlternateKey], KategorieNr

Das Ergebnis: siehe Anhang

VG
Jörg
kategorienr4.png
 
Werbung:
Hallo,

es soll eine Hierarchie innerhalb einer Tabelle erstellt werden. Die Hierarchie soll aus der Buchungskontonr und dem Kontoschlüssel erstellt werden.
In der Tabelle stehen die Kontoschlüssel aber nur in den Datensätzen, die anderen übergeordnet sind. Also ungefähr so:
Buchungskontonr; Schlüssel;
0001;
0002;
0003;
0004;
0005; 0003...0005
0006;
0007;
0012; 0004...0012

Die Schlüssel konnte ich beim Import bereits in eine 'Von' und eine 'Bis' Spalte aufteilen.

Ich hoffe, ich hab Dich richtig verstanden, du hast faktisch solch eine Tabelle:

Code:
test=*# select * from roca;
 id | von | bis
----+-----+-----
  1 |     |
  2 |   3 |   5
  3 |   4 |  12
  4 |     |
(4 rows)

und willst, wenn in den Spalten von und bis was steht, die id sowie die Zahlen von - bis in einer extra Splate haben. Wenn kein von-bis existiert, bleibt die extra Spalte leer.

Soweit richtig verstanden?


Ich hab mal das in PG gemacht, vielleicht kannst das ja irgendwie nachbilden (sofern ich Dein Problem überhaupt verstanden habe, sicher bin ich mir nicht ...):

Code:
test=*# select id, case when von is not null then generate_series(von,bis) else null end from roca;
 id | case
----+------
  1 |
  2 |    3
  2 |    4
  2 |    5
  3 |    4
  3 |    5
  3 |    6
  3 |    7
  3 |    8
  3 |    9
  3 |   10
  3 |   11
  3 |   12
  4 |
(14 rows)


Andreas
 
Werbung:
Hallo Andreas,

Du hast es so schon fast richtig verstanden. Die ID hatte ich verschwiegen. Ich mache das ganze mit dem BuchungskontenAlternateKey.
Übertragen auf Dein Beispiel befindet sich die Von 3 Bis 5 Information bei mir bei BuchungskontenAlternateKey 5, da die Von Bis Konten diesem Datensatz untergeordnet sind. Das SQL-Skript aus meinem Anfangspost liefert genau das Ergebnis, das auch Deine PG Anweisung erstellt (Habe in TSQL keine ähnlichen Befehl gefunden).
Mein Problem liegt darin, dass (siehe Bild im Anfangspost) BuchungskontenAlternateKey als späterer Primärschlüssel keine Doppelten Datensätze enthalten darf und! dass,
z.B. BuchungskontenAlternateKey 0031 zu 0031 zugeordnet wird, obwohl er, weil höchste Nummer der Von Bis Range zu 0041 untergeordnet ist (Könnte auch NULL sein, wenn keine übergeordnetet Nummer existiert. Sind diese Probleme gelöst, kann eine Hierarchie gebildet werden.

Ich habe jetzt eine Lösung gefunden. Mit Umweg über eine Hilfstabelle.

Schritt 1: Ergänzung der Datensätze um die übergeordneten Konten (KategorieNr). Dieses Skript hatte ich bereits im Anfangspost bis auf den Unterschied, dass nun bei BETWEEN der [Bis] Wert um -1 verringert wird, damit wie in oben genannten Beispiel, die 0031 nicht mehr der 0031 zugewiesen wird.
Code:
SELECT b.[BuchungskontenAlternateKey], b.[Buchungskonten], bh.[BuchungskontenAlternateKey] as KategorieNr
FROM [dbo].[DimBuchungskontenImport] b
LEFT OUTER JOIN [dbo].[DimBuchungskontenImport] bh ON (b.[BuchungskontenAlternateKey] BETWEEN bh.[Von] AND bh.[Bis] -1)
ORDER BY [BuchungskontenAlternateKey], KategorieNr

Das Ergebnis dieser Anweisung wird in dbo.DimBuchungskontenHilfe gespeichert.

Schritt 2: Entfernung der Doppelten Datensätze.
Code:
SELECT b.[BuchungskontenAlternateKey], b.[Buchungskonten], b.[Bilanz], B.[Guv], b.KategorieNr
FROM [dbo].[DimBuchungskontenHilfe] b
LEFT OUTER JOIN [dbo].[DimBuchungskontenHilfe] bh ON bh.[BuchungskontenAlternateKey] = b.BuchungskontenAlternateKey
                                                        AND  bh.KategorieNr < b.KategorieNr
WHERE bh.KategorieNr IS NULL
ORDER BY [BuchungskontenAlternateKey], KategorieNr

Nun liegen die Daten in einer Form vor, die für die Bildung einer Hierarchie nötig sind. Zwischenzeitlich habe ich die Informationen Bilanz und GuV mit in die Tabelle aufgenommen, um in einer späteren OLAP Abfrage nur Bilanz oder GuV anzeigen zu können.

Evlt kann der Umweg auch vermieden werden, aber meine SQL Kenntnisse sind noch nicht so ausgereift. Ich bin froh, dass es klappt und verbleibe
MFG
Jörg
 

Anhänge

  • kategorie6.png
    kategorie6.png
    29,8 KB · Aufrufe: 1
Zurück
Oben