1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Abfrage über 3 Tabellen

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von Netprog, 5 Juli 2011.

  1. Netprog

    Netprog Benutzer

    Hallo,

    ich bin neu hier und hoffe das mir in diesem tollem Forum geholfen wird.
    Ich habe 3 Tabellen mit folgendem Aufbau:

    Kontoauszug - ID
    - Betrag
    - EntryDate
    - KategorieID
    - Text


    Kategorien - ID
    - Bezeichnung



    Splittbuchungen - ID
    - KontoauszugID
    - KategorieID
    - Beschreibung
    - Betrag


    Womit ich jedem Datensatz in der Tabelle Kontoauszug über den Eintrag Kategorie eine
    Kategorie aus der Tabelle Kategorie zuweise (z.Bsp. Versicherungen, Miete, Telefon usw.)
    Wenn ich nun einen Eintrag in der Tabelle Kontoauszug aufsplitten muß, so trage ich
    diese in die Tabelle Splittbuchung ein. Nun zeige ich im Moment mit folgendem SQL Code
    eine Auswertung der Kontoauszugseinträge sortiert nach Kategorien an.



    select sum(amount) as summeamount, kategorie.bezeichnung

    from kontoauszug, kategorie

    where kontoauszug.amount < 0 and

    kontoauszug.kategorieid = kategorie.id

    group by kategorie.bezeichnung

    order by sum(amount) desc



    Nun zu meiner Frage, wie kann ich nun noch die Einträge in der Tabelle Splittbuchungen
    ebenfalls in diese Auswertung mit einbeziehen?

    Besten Dank schonmal im voraus.
     
  2. ukulele

    ukulele Datenbank-Guru

    Eigentlich sind die Beträge ja schon mit drin, oder werden Buchungen die in der Splitbuchungstabelle stehen nicht auch in einer Summe in die Tabelle Kontoauszüge geschrieben? Wenn dem so ist, müsstest du diese filtern, ansonsten nicht. Dann die aus der Tabelle Splittbuchungen hinzuziehen, z.B. über eine zweite Abfrage. Ich bin mir nicht sicher ob man mit UNION ALL die Ergebnisse zusammen führt oder ob man dann mit JOIN arbeiten muss. Ohne Testdaten ist mir das auch zu schwer.

    Ist jetzt vieleicht etwas wild aber mit JOIN bin ich nicht so gut. Daher probier mal dashier:

    Code:
    with tabelle as (
    select amount, kategorie.bezeichnung as kategorie
    from kontoauszug, kategorie
    where kontoauszug.amount < 0 and
    kontoauszug.kategorieid = kategorie.id
    union all
    select amount, kategorie.bezeichnung as kategorie
    from splittbuchungen, kategorie
    where splittbuchungen.amount < 0 and
    splittbuchungen.kategorieid = kategorie.id )
    select sum(amount) as amount,kategorie
    from tabelle
    group by kategorie
    order by sum(amount) desc
     
  3. Netprog

    Netprog Benutzer

    @ukulele

    Vielen Dank für den Code. Werde ich leider aber erst morgen testen können, da ich heut
    noch Mega Bürokram um die Ohren hab und so den Kopf zum Progn nicht frei hab.
    Danke aber erstmal ....
     
  4. Netprog

    Netprog Benutzer

    So hab nur noch schnell paar Demodaten angehangen, wobei zu bemerken ist, daß sollte eine Buchung
    in der Tabelle Kontoauszug aufgesplittet werden, so ist die Summe der Beträge der einzelnen Splittbuchungen
    in der Tabelle Splittbuchungen gleich des Betrages in der Tabelle Kontoauszug, nur das jede Splittbuchung einer
    beliebigen Kategorie zu gewiesen werden kann. Okay ich meld mich morgen nach dem probieren nochmal ....

    Danke
     

    Anhänge:

  5. ukulele

    ukulele Datenbank-Guru

    Das hab ich schon vermutet, daher müsstest du die Summen der Splittbuchungen aus der Kontoauszüge Tabelle ausschließen. Da es aber vermutlich sichergestellt ist, das die Summe der Splittbuchungen immer korrekt ist dürfte das nicht schwer sein. Eventuell so:

    Code:
    with tabelle as (
    select amount, kategorie.bezeichnung as kategorie
    from kontoauszug, kategorie
    where kontoauszug.amount < 0
    and kontoauszug.kategorieid = kategorie.id
    and kontoauszug.id not in ( select kontoauszugid from splittbuchungen )
    union all
    select amount, kategorie.bezeichnung as kategorie
    from splittbuchungen, kategorie
    where splittbuchungen.amount < 0
    and splittbuchungen.kategorieid = kategorie.id )
    select sum(amount) as amount,kategorie
    from tabelle
    group by kategorie
    order by sum(amount) desc
    PS: Ich hab das ganze jetzt natürlich in MSSQL gemacht, ich weiss nicht ob das in Access soweit möglich ist. Das hier funktioniert auch in SQL Studio mit deinen Daten:

    Code:
    WITH tabelle AS (
    SELECT    ko.Amount,
            ka.Bezeichnung
    FROM    OPENROWSET('Microsoft.Jet.OLEDB.4.0','D:\xxx\Bankingdaten.mdb';'admin';'',[kontoauszug]) ko,
            OPENROWSET('Microsoft.Jet.OLEDB.4.0','D:\xxx\Bankingdaten.mdb';'admin';'',[kategorie]) ka
    WHERE    ko.KategorieID = ka.ID
    AND        ko.ID NOT IN (    SELECT    kontoauszugID
                            FROM    OPENROWSET('Microsoft.Jet.OLEDB.4.0','D:\xxx\Bankingdaten.mdb';'admin';'',[splittbuchung]) )
    AND        ko.Amount < 0
    UNION ALL
    SELECT    sp.Betrag AS Amount,
            ka.Bezeichnung
    FROM    OPENROWSET('Microsoft.Jet.OLEDB.4.0','D:\xxx\Bankingdaten.mdb';'admin';'',[splittbuchung]) sp,
            OPENROWSET('Microsoft.Jet.OLEDB.4.0','D:\xxx\Bankingdaten.mdb';'admin';'',[kategorie]) ka
    WHERE    sp.KategorieID = ka.ID
    AND        sp.Betrag < 0 )
    SELECT    sum(Amount) AS Amount,
            Bezeichnung AS Kategorie
    FROM    tabelle
    GROUP BY Bezeichnung
    ORDER BY sum(Amount) DESC
    Sieht nur etwas komplizierter aus durch das umständliche Öffnen der Access Tabellen
     
  6. Netprog

    Netprog Benutzer

    @ukulele

    So nun hab ich mich mal ausführlicher mit den SQL Abfragen beschäftigt. Ich komm nur irgendwie im Moment nicht so
    recht weiter, da ich mit Delphi über ADO-Komponenten auf die ACCESS Tabellen zugreife und die leider die Verwendung
    von "with tabelle as" für die temporären Ergebnisse nicht unterstützt, oder ich bin nur zu blöd und hab nen Blackout.
     
  7. ukulele

    ukulele Datenbank-Guru

    Alles was in diesem WITH () Bereich steht, kannst du auch in einer Sicht unterbringen. Sichten sind meines Wissens nach auch in Access möglich.
     
  8. Netprog

    Netprog Benutzer

    @ukulele
    Ja du hast Recht, mit Sichten funktioniert es. :)
    Vielen Dank nochmal
     
Die Seite wird geladen...

Diese Seite empfehlen