Abfrage über 3 Tabellen

Netprog

Benutzer
Beiträge
10
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.
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.647
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
 

Netprog

Benutzer
Beiträge
10
@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 ....
 

Netprog

Benutzer
Beiträge
10
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

  • Bankingdaten.zip
    129,8 KB · Aufrufe: 3

ukulele

Datenbank-Guru
Beiträge
4.647
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
 

Netprog

Benutzer
Beiträge
10
@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.
 

ukulele

Datenbank-Guru
Beiträge
4.647
Alles was in diesem WITH () Bereich steht, kannst du auch in einer Sicht unterbringen. Sichten sind meines Wissens nach auch in Access möglich.
 
Werbung:
Oben