PDA

Vollständige Version anzeigen : Hilfe bei Abfrage: mit einer Zeile oberhalb bzw. Differenz zu Vormonat errechnen


Mischi01
29.05.2012, 09:53
Hallo zusammen,

ich habe eine Datenbank mit aufsummierten Beträgen (also jeden Monat kommt etwas hinzu und ich habe immer die Gesamtsumme in meiner Betragsspalte) und möchte gern die Werte "isoliert" zum Vormonat abfragen.
Ich möchte also gern wissen, was im jeweiligen Monat als Betrag zur Gesamtsumme hinzugekommen/abgegangen ist.
Zur Verdeutlichung habe ich mal eine Exceltabelle beigefügt - hier ist die Rechnerei simpel. Ich möchte also gern die Werte in der Spalte "ISOLIERT" (D) per Accessabfrage ausrechnen.
Habt ihr eine Idee, wie es gehen könnte?
Danke & Gruß, Michael

Atrus2711
29.05.2012, 10:12
Hi,
gehe analog hierzu vor:
http://www.ms-office-forum.de/forum/showthread.php?t=289872

Mischi01
29.05.2012, 11:35
Hallo Martin,

besten Dank - das hat mir schon sehr weitergeholfen.
Allerdings habe ich Rechenfehler drin - und zwar immer dann, wenn der Betrag im Folgemonat niedriger wird.
Siehe Beispieldatenbank Abfrage2: ab Monat 7 (Konto 400 und Region A) stimmt die Rechnung nicht mehr.
Hast du evt. noch einen Tip? Im Excel würde ich beide Beträge jeweils in Klammern in Klammern gesetzt subtrahieren, damit es stimmt.

Gruß Micha

Atrus2711
29.05.2012, 11:43
Hi,

der Subselect ist nicht ok. Es ist ja nicht der maximale Betrag der "vorigen" Sätze relevant, sondern der Betrag (=der eine!) des einen, vorigen Satzes.

Es wäre also zuerst die ID (alternativ: der Hilfskey aus Konto, Jahr und Monat) zu ermitteln, der den vorigen Satz markiert. Dessen Betrag (da gibts nur einen!) ist der abzuziehende Wert.

ebs17
29.05.2012, 12:35
Bezogen auf Deine Datenlage und Deinen derzeitigen Wunsch:
SELECT T1.KONTO ,
T1.REGION,
T1.MONAT ,
T1.JAHR ,
T1.BETRAG,
T1.BETRAG - T2.BETRAG AS Diff
FROM Tabelle1 AS T1
LEFT JOIN Tabelle1 AS T2
ON (T1.JAHR = T2.JAHR)
AND (T1.REGION = T2.REGION)
AND (T1.KONTO = T2.KONTO)
AND (T1.MONAT = T2.MONAT + 1);
Mit dem momentanen "Datenmodell" gibt es aber erhebliche Probleme, wenn Du Differenzen über einen Jahreswechsel hinaus darstellen willst, und in einer Datenbank ist es unüblich bis verpönt, pro Jahr eine Tabelle zu verwenden, sondern die Daten aller Zeiträume kommen in eine Tabelle.

Es wäre also besser, statt der Felder Monat und Jahr ein Feld vom Typ DateTime zu verwenden, dass jeweils den Monatsersten als Inhalt hat. Das wäre inhaltlich praktisch die gleiche Information, per DateAdd könnte man aber beliebig die Monate hochzählen.

Mischi01
29.05.2012, 12:37
Danke Martin, doch nun versteh' ich's nicht mehr :(

Die Abfrage sieht nun wie folgt aus:
SELECT Tabelle1.KONTO, Tabelle1.REGION, Tabelle1.MONAT, Tabelle1.JAHR, [KONTO] & [REGION] & [MONAT] & [JAHR] AS ID, Tabelle1.BETRAG, [BETRAG]-(select max([b1.BETRAG]) from Tabelle1 b1 where b1.JAHR=tabelle1.JAHR and b1.REGION=tabelle1.REGION and b1.KONTO=tabelle1.KONTO and b1.ID=tabelle1.ID and b1.ID < Tabelle1.ID) AS ISOLIERT
FROM Tabelle1;




Allerdings fragt Access jetzt als Parameter die ID beim Ausführen der Abfrage.

Mischi01
29.05.2012, 12:45
Hallo Eberhard,

auch besten Dank an dich! Vom Ergebnis ist es genau das, was ich mir vorgestellt habe. Es ist so, dass der der Januar immer von vorn beginnt - also der Differenzbetrag immer gleich dem "normalen" Betrag entspricht. Dies würde ich über eine Wenn-Funktion abbilden (sprich: wenn Monat = 1 dann Betrag sonst die Rechung...)

Micha

Atrus2711
29.05.2012, 12:53
Hallo Micha,

Eberhard hat dir bereits mit einem besseren Ansatz weitergeholfen.

Wenn du dort die Differenz umstellst auf
...NZ(T1.BETRAG - T2.BETRAG, T1.Betrag) AS Diff...dann hast du auch im Januar deinen Wert. Die Differenz ist im Januar leer, worauf das NZ dann prompt den Januarwert ansetzt.