Kreuztabelle

mikel

Aktiver Benutzer
Beiträge
45
Hallo zusammen,
habe nach langer Zeit mal wieder eine Frage.
Ich haae mir ein Haushaltsbuch erstellt wo ich meine Einahmen und Ausgaben dokumentiere.Beträge werden je nach definierten Kategorien zugeordnet.
z.B. Habe was vom Bäcker eingekauft wird die Rubrik Lebensmittel verwendet. Betanke ich mein Fahrzeug, wird die Kategorie Auto verwendet u.s.w.

Um das Ganze pro Monat auf einem Report sichtbar zu machen habe ich eine Kreuztabelle erstellt. Bei diese habe ich allerdings das Problem, wenn ich die Summen pro Kategorie aufsummieren möchte, Monat 1 + Monat 2 + Monat3 u.s.w. bildet mir die Kategorie keine Gesamtsumme wenn 1 Monat kein Betrag oder der Wert 0 gefunden wird.

Gibt es da eine Lösung?

Grüße
 
Werbung:
Gibt es da eine Lösung?
Ja, dieses Problem ist immer gleich zu lösen. Eine Datenbank denkt sich niemals Werte aus. Sie müssen da sein.
Wenn die vorhandenen Werte nicht dem Bedarf entsprechen, müssen sie für den Bedarf der Ausgabe ergänzt werden.

Bei einer Abfrage pro Monat muss also jeder der 12 Monate vorhanden sein und diese erforderlichen Daten müssen unbedingt angezeigt werden.
Das erreicht man durch einen Outer Join.
Datenbasis (neu anzulegen):
Code:
create table monat_statistik ...
insert into monat_statistik values (1), (2), (3),(4), (5), (6),(7), (8), (9),(10), (11), (12);

Abfrage mit Berücksichtigung aller Monate im Jahr:
Code:
Select ms.monat,
        d.kategorie,
        d.wert
  from monat_statistik ms left join
       daten d 
    on ms.monat = d.monat
Dieses Basisstatement enthält noch keine Aggregation, aber es zeigt auf diese Art die Datenlücken an. Die Aggregation liefert dann für jeden Monat, der in der Tabelle monat_statistik eingetragen ist, einen Wert, notfalls eben 0. Um die Funktionsweise noch deutlicher zu machen, kann man in der Tabelle monat_statistik Monate weglassen, erfinden (Monat 13 oder 4711) oder doppelt eintragen und sich die Auswirkung auf die Abfrage anschauen. (Nachher nicht das Bereinigen vergessen)
Wenn der Monatswert als solches in den Originaldaten nicht passend (Format, eigenständige Spalte) vorliegt, muss die Abfrage entsprechend angepasst werden.
Dazu kann man den Monat probehalber (1. Entwurf der Abfrage) mit einer Funktion extrahieren. Bei großen Datenmengen ist das allerdings nicht gut, da ein mglw. vorhandener Index auf der Spalte dann nicht mehr nutzbar ist für diese Abfrage.

Wie gesagt, das Prinzip ist immer anwendbar oder besser, man muss es immer anwenden, wenn nicht gewünschte Datenlücken ausgeglichen werden müssen. Egal ob bei Monaten, Jahren, Tagen, Kategorien oder was auch immer.
 
Danke @dabadebdu, SQL-Profiwissen in Reinkultur.

Als Access-Nutzer mache ich es immer so:

Auszug aus der Ursprungsabfrage/Tabelle:
Zwischenablage03.webp

Kreuztabellenabfrage darauf: (Sie fordert die Eingabe der Parameter "Datumvon" und "Datumbis")
Zwischenablage05.webp

Ergebnis je nach Datumseingrenzung. Monatsspalten ohne Werte (Kein Bewegungssatz vorhanden oder nicht in Datumseingrenzung) bleiben leer.

Zwischenablage04.webp
 
Als Access-Nutzer mache ich es immer so:
Ich habe Access schon lange nicht mehr genutzt. Wenn ich den TE richtig verstanden habe, ist nicht die Kreuztabellenabfrage an sich das Problem, sondern Monate ohne Daten, die dann nicht als Spalte abgetragen werden.
Wenn der Kreuztabellenassistent das in irgendeiner Form automatisch/ freiwillig / per Vorgabe macht, ist der Punkt in Deiner Erläuterung untergegangen.
Vielleicht kannst Du da noch weiter helfen.

Ansonsten dürften (hoffentlich) meine Angaben auch für Access gelten. Basisdaten ergänzen (also Abfrage umbauen wie allgemein beschrieben). Auf den Ergebnissen der Abfrage wie immer die Kreuztabellenabfrage laufen lassen.
 
Hier der von Access generierte SQL-Code:
Code:
TRANSFORM Sum(BewZwi.Saldo) AS SummevonSaldo
SELECT BewZwi.Kostart, Sum(BewZwi.Saldo) AS [Gesamtsumme von Saldo]
FROM BewZwi
WHERE (((BewZwi.Datum)>=[Datumvon] And (BewZwi.Datum)<=[Datumbis]))
GROUP BY BewZwi.Kostart
PIVOT Format([Datum],"mmm") In ("Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez");

Die Formatanweisung veranlasst Access in jedem Fall auch dann Spalten zu bilden, wenn keine Werte/Datensätze für den Monat vorhanden sind.
 
Die Formatanweisung veranlasst Access in jedem Fall auch dann Spalten zu bilden..
Ok, ich habe mich schlampig ausgedrückt. Es geht nicht um fehlende Spalten, sondern um die fehlende Werte, in den Spalten.

wenn ich die Summen pro Kategorie aufsummieren möchte, Monat 1 + Monat 2 + Monat3 u.s.w. bildet mir die Kategorie keine Gesamtsumme wenn 1 Monat kein Betrag oder der Wert 0 gefunden wird
Ich vermute der TE verwendet die Kreuztabellenabfrage genau wie Du bzw. es gibt auch keine andere Möglichkeit in Access. Falls es also keinen "Trick" / Option gibt, das Verhalten zu ändern, bliebe es trotzdem bei meinem Vorschlag.

Ansonsten fällt mir dazu nur noch ein Problembereich ein, der zu verschiedenem Verhalten führen könnte, das sind unpassende oder sagen wir ungünstig gewählte Datentypen wie Zahlen als String.
 
Aber, das ist doch genau das Thema. Trotz fehlender Werte in den einzelnen Monaten sollen diese angezeigt und über die Spalten mit Werten soll die Gesamtsumme gebildet werden. Gemau das macht Access hier.
 
Werbung:
Zurück
Oben