Announcement

Collapse
No announcement yet.

Hilfsspalte für Hierarchie erstellen - die Daten liegen in Von-Bis vor.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hilfsspalte für Hierarchie erstellen - die Daten liegen in Von-Bis vor.

    Hallo,

    der Tabelle Buchungen soll eine Hilfsspalte hinzugefügt werden. In der Hilfsspalte soll die übergeordnete Kontonummer geschrieben werden.
    Wie in der Abb. zu sehen, ist die Information zu einem übergeordneten Konto nur in dem Datensatz des übergeordneten Konto gespeichert.Auch dieses Konto kann einem übergeordneten Konto untergeordnet sein.

    Ich bin nun auf der Suche nach einer SQL Anweisung, die es ermöglicht, die jeweilige Kontennummer BETWEEN Von AND Bis abgleicht und wenn enthalten die Kontonummer des Datensatzes zurückgibt, indem sie enthalten ist.

    Gibt es einen Befehl, der es erlaubt zu überprüfen, ob sich die Kontonummer zwischen den Werten zweier Spalten befinden und wenn er sich in mehreren Spalten befindet nur den Datensatz nimmt, bei dem Bis-Von kleiner ist?


    Vielen Dank für Eure Hilfe!
    Ich hoffe, Ihr versteht was ich meine.

    VG
    Jörg
    kategorienr.jpg

  • #2
    Möglicherweise meinst du sowas.

    [Highlight=Sql]select *, (select min(b.BuchungungskontenAlternateKey) from Buchungen b where b.BuchungungskontenAlternateKey between a.Von and a.Bis) as 'meinLiebeZusätzlicheSpalte'
    from Buchungen a[/Highlight]

    Comment


    • #3
      Hallo Ralf,
      vielen Dank für Deine Antwort und das Skript!
      Es könnte funktionieren. Es soll nicht 'Von' angezeigt werden, sondern die Buchungsnummer.
      z.B. in Zeile 6 Buchungsnummer 0015 soll bei KategorieNr 0031 stehen,
      in Zeile 11 Buchungsnummer 0031 KategorieNr 0041 (zusätzliche Schwirigkeit, da 0031 die höchste Nummer der Von Bis Range darstellt aber z 0041 gehört)
      Zeile 12 Buchungsnummer 0035 KategorieNr 0041

      Kann dieser Sachverhalt auch mit diesem "Skript-Typ" abgebildet werden?
      kategorienr2.jpg

      Comment


      • #4
        Vll. sollte ich mit einer Hilfstabelle arbeiten?(siehe Abb.)
        Habe mal in "Menschensprache" vorformuliert, was geschehen müsste:

        Wenn BuchungskontenAlternateKey(DimBuchungskonten) betwenn Von(DimBuchungkontenHierarchie) AND Bis(DimBuchungkontenHierarchie) dann schreibe BuchungskontenAlternateKey(DimBuchungskontenHierarchie) in KategorieNr(DimBuchungskonten).
        Wenn BuchungskontenAlternateKey(DimBuchungskonten) = Bis(DimBuchungkontenHierarchie) Dann suche BuchungskontenAlternateKey(DimBuchungskonten)+1 betwenn Von(DimBuchungkontenHierarchie) AND Bis(DimBuchungkontenHierarchie) dann schreibe BuchungskontenAlternateKey(DimBuchungskontenHierarchie) in KategorieNr(DimBuchungskonten).

        Was meint Ihr dazu?
        Welche SQL Befehle kommen in Frage?
        VG
        Jörg

        Ach ja, der BuchungskontenAlternateKey(DimBuchungskonten) kann mehrfach in Von-Bis(DimBuchungskontenHierarchie) vorkommen. Man müsste also zählen, in wie vielen Datensätzen der Wert vorkommt und den Datensatz wählen, der die geringste Von - Bis Distanz beinhaltet.

        kategorienr3.jpg
        Zuletzt editiert von J.Roca; 06.03.2013, 19:39.

        Comment


        • #5
          Hallo,
          nun habe ich eine Möglichkeit gefunden, jedem Datensatz die entsprechende übergeordnete Kategorie zuzuordnen.

          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
          Jetzt müssen die doppelten Datensätze entfernt werden. Dabei sollen die Datensätze mit den höheren KategorieNr entfernt werden ausser der BuchungskontenAlternateKey entspricht der KategorieNr. Hier soll der Datensatz mit der nächsthöheren KategorieNr bestehen bleiben. (So kann eine Hierarchie gebildet werden)

          Wie erweitere ich dieses SQL Skript, um die doppelten Datensätze zu löschen?
          VG
          Jörg
          kategorienr4.jpg

          Comment


          • #6
            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
            kategorie6.jpg
            Zuletzt editiert von J.Roca; 08.03.2013, 20:01.

            Comment

            Working...
            X