none
SQL Abfrage mehere Tabellen nebeneinander RRS feed

  • Frage

  • Hallo,

    ich habe zwei Tabellen. Ich möchte zwei abfragen unabhängig voneinander nebeneinander darstellen. die einzige bezugsrgröße sein ein ID feld sein. Ich übertrag das mal auf einen simplifizierten Fall und erläutere es mal.

    Tabelle Konto mit den Spalten ID, Name, Vorname usw

    1    Müller   Max

    2    Mustermann Manfred

    sowie

    Tabelle Bewegungen mit den Spalten ID, Bewegungsart, Betrag, Konto_ID usw.

    1   Zahlung   12   1

    2   Gutschrift 20   1

    3   Zahlung    30  1

    4   Zahlung    50  1

    5   Zahlung    32  1

    usw

    Jetzt möchte ich gerne eine Darstellung haben, die folgende Darstellungen zusammen fasst

    Select * from Konto join Bewegung where bewegung.Bewegungsart like 'G%'

    Select * from Konto join Bewegung where bewegung.Bewegungsart like 'Z%'

    ABER und das ist große aber die Darstellung soll wie folgt aussehen

    Kontoinhaber, Gutschriften, Zahlungen

    Max Müller,        20 ,   12

    Max Müller,        (null) ,   30

    Max Müller,        (null) ,   50

    Max Müller,        (null) ,   32

    Oder aber wenn es mehr Zahlungen als Gutschriften gibt

     

    Max Müller,        20   ,   12

    Max Müller,        30 ,   30

    Max Müller,        25 ,   (null)

    Max Müller,        85 ,   (null)

    Also es soll immer die erste Zeile mit den ersten Eintrag von Zahlung und Gutschrift gefüllt sein und in der zweiten Zahlung dann entsprechend zweite Zahlung und zweite Gutschrift. Die Zeilenanzahl soll max(Zahlungen Anzahl, Gutschrift Anzahl) sein. Wenn keine Zahlung aber Gutschriften mehr übrig ist sollen die restlichen Spalten halt mit null gefüllt weden oder umgekehert.

    Leider erzeugt meine Kommando bei Beispiel 2 folgende Darstellung

    Max Müller,        20   ,   12

    Max Müller,        20   ,   30

    Max Müller,        30 ,   12

    Max Müller,        30 ,   30

    Max Müller,        25 ,   12

    Max Müller,        25 ,   30

    Max Müller,        85 ,   12

    Max Müller,        85 ,   30

    Mein Kommando lautet

    select * from konto

    outer apply (select * from bewegung where bewegung.konto_id = konto.id and bewegung.Bewegungsart like 'Z%') as Zahlungen

    outer apply (select * from bewegung where bewegung.konto_id = konto.id and bewegung.Bewegungsart like 'G%') as gutschriften

    Weiß jemand Rat? Ich bin über jeden Hinweiß glücklich.

    Freitag, 23. Januar 2015 11:02

Antworten

  • Hallo UrielMhezzek,

    Du willst also die Spalten Bewegungsart und Betrag transponieren, so dass die neuen Spalten Gutschrift und Zahlung (nach den Werten in der Spalte Bewegungsart) genannt werden und die entsprechenden Bewegungen pro Person (Max Müller, Manfred Mustermann) usw. enthalten und dabei den Vornamen und den Namen der Person in eine Zeichenfolge verketten. Das kann man mithilfe der Pivot-Funktion erreichen:

    WITH Custc (Id, Bewegungsart, Betrag, Rid)
    AS
    (
    SELECT Kontoid, Bewegungsart, Betrag, ROW_NUMBER() OVER (PARTITION BY (Bewegungsart) ORDER BY Kontoid)
    AS Rid FROM Bewegungen
    ),
    KontoZ(Id, Name)
    AS (SELECT Id, Vorname + ' ' + Name FROM Konto)
    SELECT Name, Gutschrift, Zahlung
    FROM (SELECT Id, Bewegungsart, Betrag, Rid FROM Custc) qTabelle
    PIVOT( MAX(Betrag) FOR Bewegungsart IN (Gutschrift, Zahlung)) AS pTabelle
    RIGHT OUTER JOIN KontoZ ON KontoZ.Id=pTabelle.Id

    Warum man die Partition-By braucht, wird in diesem Artikel erklärt. Mit der rechten äußeren Verknüpfung bekommt man auch als Ergebnis Personen aus der Konto-Tabelle, für die keine Gutschriften und Zahlungen in der anderen Tabelle eingetragen wurden (in Deinem Fall Manfred).

    Gruß,
    Dimitar

    P. S. Ich füge einen Screenshot mit dem Abfrageergabnis bei:


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.


    Montag, 26. Januar 2015 12:07
    Administrator