Union all

rolandg1881

Aktiver Benutzer
Beiträge
40
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.pngupload_2019-12-4_9-42-43.png

Danke und lg
 
Werbung:
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?
 
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
 
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)
 
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
 
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.
 
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 ;-)
 
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
 
Werbung:
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.
 
Zurück
Oben