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

Union all

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von rolandg1881, 4 Dezember 2019.

  1. rolandg1881

    rolandg1881 Benutzer

    Hallo!
    In unserem System gibt es eine Verdichtungskontenstruktur d.h. unter einem Verdichtungskonto stehen Konten(Kostenstellen) und es können wieder Verdichtungskonten darunter stehen usw.

    Ich habe es jetzt geschafft diese Struktur mit einer SQL Abfrage auszulesen habe aber noch ein (hoffentlich) kleines Problem.

    Wie man in der Auswertung sehen kann rufe ich die Verdichtungskontonummer 41000V ab. Das ist das "Überkonto" und unter Kontonummer sehe ich alle daraunter liegenden Konten ABER leider wird ganz oben auch noch das 41000V mit reingenommen. Kann mir jemand helfen meine Abfrage so anzupassen, dass ich nur die darunterliegenden Konten in der Spalte Konto sehe?

    Zur Info ALLE Konten egal ob Verdichtung oder "Unterkonto" stehen in einer Tabelle Account$CostCenter wo JEDES Konto eine PK_id (HauptId) und dann die FK_verd (VerdichtungskontoId9 hat mit dem die Verbindung zum Verdichtungskonto beschrieben wird.

    Meine Abfrage schaut so aus:

    with k1 AS (
    select
    CAST(ACC.PK_id AS CHAR(30))KontoId,
    ACC.nummer AS ACC_Nummer,
    ACC.nummerb AS ACC_Nummer1,
    ACC.name AS Kontoname,
    ACC.FK_overd AS ACC_overd
    from Account$CostCenter ACC
    ), k2 AS (

    select
    1 AS Ebene,
    k1.KontoId AS HauptkontoId,
    k1.ACC_Nummer AS Verdichtungskontonummer,
    k1.ACC_Nummer1 AS Kontonummer,
    k1.Kontoname AS Kontoname,
    CAST(k1.KontoId AS CHAR(30))KontoId,
    CAST(k1.ACC_overd AS CHAR(30))ACC_overd,
    cast(k1.KontoId AS VARCHAR(MAX)) AS pfad
    from k1
    UNION ALL

    select k2.ebene + 1,
    k2.HauptkontoId,
    (CASE WHEN k2.Ebene + 1 = 1 THEN CAST(k1.ACC_Nummer AS CHAR(30)) ELSE k2.Verdichtungskontonummer END),
    k1.ACC_Nummer1 AS Kontonummer,
    k1.Kontoname,
    CAST(k1.KontoId AS CHAR(30))ACC_PK_id,
    CAST(k1.ACC_overd AS CHAR(30))ACC_overd,
    cast(k2.pfad + '\' + cast(k1.KontoId AS VARCHAR(MAX)) AS VARCHAR(MAX)) AS pfad
    from k2
    INNER JOIN k1
    ON k2.KontoId = k1.ACC_overd
    )

    Select *
    from k2
    where k2.Verdichtungskontonummer = '41000V'




    Ausgabe: Hier wäre super wenn die erste Zeile nicht drin wäre.
    upload_2019-12-4_9-42-43.png upload_2019-12-4_9-42-43.png

    Danke und lg
     
  2. ukulele

    ukulele Datenbank-Guru

    Du hast hier eine hirachische Struktur. Bevor ich da den SQL Code überhaupt richtig lese eine wichtige Frage: Wie tief geht das? Du schreibst es können Konten oder Verdichtungskonten unter Verdichtungskonten stehen. Gibt es also maximal Konto unter vKonto unter vKonto oder ist die Anzahl der Ebenen beliebig?
     
  3. rolandg1881

    rolandg1881 Benutzer

    Hallo Ukulele!
    Danke für die Antwort.
    Momentan gibt es nur Verdichtungskonto darunter wieder eines und dann darunter nurmehr normale Konten als nicht sehr weit verzweigt. Natürlich wäre es nicht schlecht wenn man einen kleinen "Puffer" hätte falls mal eine Stufe hinzukommt was ich aber ehe nicht glaube.

    lg Roland
     
  4. akretschmer

    akretschmer Datenbank-Guru

    für sowas gibt es rekursive Abfragen...
     
  5. rolandg1881

    rolandg1881 Benutzer

    @akretschmer Ist das was ich da habe keine rekursive Abfrage?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Nein, es fehlt das Schlüsselwort'recursive'.

    Mal als beispiel die Sache mit den Reiskörnern auf dem Schachbrett ...


    Code:
    test=*# SELECT feld, koerner_einzeln,
    SUM(koerner_einzeln) OVER (ORDER BY feld)
    AS koerner_summe
    FROM (
    WITH RECURSIVE reis AS
    (SELECT 1 AS feld, 1::DECIMAL AS koerner_einzeln
    UNION ALL
    SELECT feld + 1, koerner_einzeln * 2
    FROM reis
    WHERE feld < 64)
    SELECT *
    FROM reis) AS rekursion;
     feld |   koerner_einzeln   |    koerner_summe     
    ------+---------------------+----------------------
        1 |                   1 |                    1
        2 |                   2 |                    3
        3 |                   4 |                    7
        4 |                   8 |                   15
        5 |                  16 |                   31
        6 |                  32 |                   63
        7 |                  64 |                  127
        8 |                 128 |                  255
        9 |                 256 |                  511
       10 |                 512 |                 1023
       11 |                1024 |                 2047
       12 |                2048 |                 4095
       13 |                4096 |                 8191
       14 |                8192 |                16383
       15 |               16384 |                32767
       16 |               32768 |                65535
       17 |               65536 |               131071
       18 |              131072 |               262143
       19 |              262144 |               524287
       20 |              524288 |              1048575
       21 |             1048576 |              2097151
       22 |             2097152 |              4194303
       23 |             4194304 |              8388607
       24 |             8388608 |             16777215
       25 |            16777216 |             33554431
       26 |            33554432 |             67108863
       27 |            67108864 |            134217727
       28 |           134217728 |            268435455
       29 |           268435456 |            536870911
       30 |           536870912 |           1073741823
       31 |          1073741824 |           2147483647
       32 |          2147483648 |           4294967295
       33 |          4294967296 |           8589934591
       34 |          8589934592 |          17179869183
       35 |         17179869184 |          34359738367
       36 |         34359738368 |          68719476735
       37 |         68719476736 |         137438953471
       38 |        137438953472 |         274877906943
       39 |        274877906944 |         549755813887
       40 |        549755813888 |        1099511627775
       41 |       1099511627776 |        2199023255551
       42 |       2199023255552 |        4398046511103
       43 |       4398046511104 |        8796093022207
       44 |       8796093022208 |       17592186044415
       45 |      17592186044416 |       35184372088831
       46 |      35184372088832 |       70368744177663
       47 |      70368744177664 |      140737488355327
       48 |     140737488355328 |      281474976710655
       49 |     281474976710656 |      562949953421311
       50 |     562949953421312 |     1125899906842623
       51 |    1125899906842624 |     2251799813685247
       52 |    2251799813685248 |     4503599627370495
       53 |    4503599627370496 |     9007199254740991
       54 |    9007199254740992 |    18014398509481983
       55 |   18014398509481984 |    36028797018963967
       56 |   36028797018963968 |    72057594037927935
       57 |   72057594037927936 |   144115188075855871
       58 |  144115188075855872 |   288230376151711743
       59 |  288230376151711744 |   576460752303423487
       60 |  576460752303423488 |  1152921504606846975
       61 | 1152921504606846976 |  2305843009213693951
       62 | 2305843009213693952 |  4611686018427387903
       63 | 4611686018427387904 |  9223372036854775807
       64 | 9223372036854775808 | 18446744073709551615
    (64 rows)
    
    
     
  7. castorp

    castorp Datenbank-Guru

    Auch wenn das im SQL Standard als verpflichtend definiert wurde: Microsoft interessiert das nicht - dort ist es ein Fehler wenn man es verwendet
     
    akretschmer gefällt das.
  8. akretschmer

    akretschmer Datenbank-Guru

    Echt? Faszinierend ;-)
     
  9. rolandg1881

    rolandg1881 Benutzer

    Hmm? Als Datenban-Lulu ;-) und nicht Guru komm ich mit den Infos nicht weiter. Einzig Ukulele hat mir bisher immer Praxisnahe Antworten gegeben.
    Aber ich werde mir die Schachbrett Reiskorn Theorie mal reinziehen und schauen ob das was bringt.

    lg
     
  10. akretschmer

    akretschmer Datenbank-Guru

    yeah, sollte eigentlich ähnlich in M$SQL gehen - ich verwende PostgreSQL. Aber die Syntax sollte relativ ähnlich sein, probier es aus. Damit kannst dann Deine Kostenstellen etc. beliebig tief hierarchisch aufbauen.
     
  11. ukulele

    ukulele Datenbank-Guru

    Ja rekursiv ist eine Möglichkeit, bei 3 Ebenen insgesamt kann man es theoretisch auch noch mit UNION machen.

    Bei MSSQL ist das eigentlich gar nicht anders, es fehlt nur das Schlüsselwort :) und naja Konvertierung arbeitet anders. Außerdem muss WITH immer am Anfang stehen. Beispiel:
    Code:
    WITH t AS (
    SELECT 1 AS zahl
    UNION ALL
    SELECT t.zahl + 1
    FROM t
    WHERE t.zahl < 10
    )
    SELECT *
    FROM t
    Thats it. Die mit UNION verbundene Tabelle fragt sich quasi selber ab und hängt Informationen an. Natürlich musst du jetzt deine Daten da einbauen und das ist nicht ganz einfach. Du kannst aber mit Joins arbeiten etc. Leider ist das jetzt etwas viel Arbeit das für deine Tabellen zu schreiben, am besten versuchst du es selbst ;-)
     
    Walter gefällt das.
  12. rolandg1881

    rolandg1881 Benutzer

    Hi ukulele!
    Danke für die Hilfe.

    lg
     
  13. rolandg1881

    rolandg1881 Benutzer

    Nur noch eine Frage. Was ist an meiner ursprünglich geposteten(von ukuluele abgekupferten) Abfrage falsch? Im Prinzip liefert sie das richtige Ergebnis nur das nicht NUR die Unterkonten (Kontonummern) angezeigt werden sondern auch das Hauptverdichtungskonto ganz oben steht?

    lg
     
  14. ukulele

    ukulele Datenbank-Guru

    Ich hab dein SQL wie bereits erwähnt nicht wirklich gelesen aber ja, du verwendest bereits Rekursion.

    Auch gibst du bereits eine Ebene mit aus. Wenn du die erste Ebene nicht haben willst dann wäre es doch ein leichtes ein WHERE Ebene != 1 zu nutzen oder verstehe ich die Frage im ersten Post nicht?

    Und deine Spalte Verdichtungskontonr und Kontonr haben natürlich das Logik-Problem das sie eigentlich einen Pfad abbilden müssten denn es kann ja auch ein "Unter-Verdichtungskonto" sein.
     
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