Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SELECT FROM LEFT INNER JOIN ON BETWEEN - weiter eingrenzen.

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von J.Roca, 7 März 2013.

  1. J.Roca

    J.Roca Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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
     
  3. J.Roca

    J.Roca Benutzer

    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:

Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden