Abfrage von 2 Tabellen: Gruppiert nach Monat aber mehrfach addiert

TracerHD

Neuer Benutzer
Beiträge
1
Hallo,

Ich habe hier einen Logikfehler, da Access hier nur das maht was ich ihm sage:
Ich habe 2 Tabellen:
- AUSGABEN mit den Spalten ID, Item, Preis, Menge, Summe, Typ, Datum Eingang, Datum Ausgang, Tage Dauer und Monat
- 3 Datensätze (1 x März, 1 x April, 1 x Mai)
- EINNAHMEN mit den Spalten ID, Item, Preis, Menge, Summe, Typ, Datum Eingang, Datum Ausgang, Tage Dauer und Monat
- 5 Datensätze (1 x März, 2 x April, 2 x Mai)
Jetzt mache ich eine Abfrage:
SELECT [Einnahmen.Monat] AS [Monat], SUM ( [Ausgaben.Summe] ) AS [A Summe] , SUM ( [Einnahmen.Summe] ) AS [E Summe] FROM Ausgaben INNER JOIN Einnahmen ON Ausgaben.Monat = Einnahmen.Monat WHERE Ausgaben.Monat = Einnahmen.Monat GROUP BY Einnahmen.Monat ORDER BY Einnahmen.Monat ASC

Was macht diese Abfrage?
Sie gibt mir 3 Datensätze ( 1 x März, 1 x April, 1 x Mai) zurück. So weit so gut, jedoch ist die Summierung der Spalte [A Summe] falsch, weil es weniger Datensätze in Ausgaben gibt als in Einnahmen für April und Mai. Der Wert in [A Summe] wird so oft Summiert wie es Datensätze in Einnahmen gibt für den jeweiligen zugehörigen Monat.

Was soll diese Abfrage eigentlich machen?
Eigentlich sollte sie den Monat anzeigen, Die Summe von Ausgaben.Summe und Einnahmen.Summe von einander losgelöst.

Beispiel:
AUSGABEN:
IDSummeMonat
1100März
2100April
3100Mai

EINNAHMEN:
IDSummeMonat
1200März
2200Aprill
310Aprill
4200Mai
510Mai

ERGEBNIS wie es ist:
MonatA SummeE Summe
März100200
April200210
Mai200210

In [A Summe] sollte aber nur jeweils 100 stehen. [E Summe] ist richtig.

Sicherlich ist die Lösung total einfach, ich komme aber nicht drauf. Wie muss der Codes aussehen damit es so angezeigt wird wie gewünscht?
Danke im Vorraus =)
 
Werbung:
Was soll denn die Abfrage des Where Kriteriums Ausgaben=Einnahmen bezwecken?
Summiere alles, wo es für eine Ausgabe vom Betrag x auch eine Einnahme vom Betrag X gibt?

Lass das mal weg, wenn Du Gesamtsummen haben willst. Und nimm neben Deinen runden Beträgen etwas realistischeres dazu.
 
sowas vielleicht?

Code:
edb=*# select * from ausgaben ;
 id | summe | monat 
----+-------+-------
  1 |   100 | märz
  2 |   100 | april
  3 |   100 | mai
(3 rows)

edb=*# select * from einnahmen ;
 id | summe | monat 
----+-------+-------
  1 |   200 | märz
  2 |   200 | april
  3 |    10 | april
  4 |   200 | mai
  5 |    10 | mai
(5 rows)


edb=*# with a as (select monat, sum(-summe) from ausgaben group by monat ), e as (select monat, sum(summe) from einnahmen group by monat) select e.monat, e.sum einnahme, a.sum ausgabe, e.sum+a.sum saldo from a inner join e on (e.monat=a.monat);
 monat | einnahme | ausgabe | saldo 
-------+----------+---------+-------
 märz  |      200 |    -100 |   100
 april |      210 |    -100 |   110
 mai   |      210 |    -100 |   110
(3 rows)


edb=*#

Sehr zukunftssicher ist das nicht, in einem Jahr knallt es, auch die Sortierung ist eher zufällig angenehm ...
 
Dein eigentliches Problem ist das du erst aggregieren musst und dann joinen, sonst zählst du Werte doppelt. Du kannst das so lösen wie akretschmer (Access müsste WITH können) oder anders aufschreiben falls das für dich leichter ist.

Rein logisch betrachtet brauchst du nach dem Aggregat auch einen FULL OUTER JOIN, denn es kann ja auch mal einen Monat keine Ausgaben oder Einnahmen geben:
Code:
SELECT    ( CASE WHEN Einnahmen.Monat IS NOT NULL THEN Einnahmen.Monat ELSE Ausgaben.Monat END ) AS Monat,
[Ausgaben.Summe] AS [A Summe] ,
[Einnahmen.Summe] AS [E Summe]

FROM (    SELECT    Ausgaben.Monat,
                sum(Ausagaben.Summe) AS Summe
        FROM    Ausagaben
        GROUP BY Ausgaben.Monat ) Ausgaben
FULL OUTER JOIN (    SELECT    Einnahmen.Monat,
                            sum(Einnahmen.Summe) AS Summe
                    FROM    Einnahmen
                    GROUP BY Einnahmen.Monat ) Einnahmen
ON        Ausgaben.Monat = Einnahmen.Monat

ORDER BY ( CASE WHEN Einnahmen.Monat IS NOT NULL THEN Einnahmen.Monat ELSE Ausgaben.Monat END )  ASC
Und das Jahr musst du definitiv noch einbauen, das ist Übungsaufgabe.
 
Werbung:
Was soll denn die Abfrage des Where Kriteriums Ausgaben=Einnahmen bezwecken?..
Oh, da habe ich ja ziemlich daneben gehauen. Ich sollte vielleicht richtig hinschauen, bevor ich antworte.

Was die Zeit angeht, Jahre, Monate. Da bietet sich m.E. eine eigene, zentrale Datenquelle an. Die könnte man notfalls auch generieren. Dann spart man sich etwas Verbiegung bei den Joins und kommt mit Left Joins aus. Die Darstellung der Werte wäre dann auch ohne Case.
 
Zurück
Oben