PDA

Vollständige Version anzeigen : Table Left Join - temp. Tabelle umgehen


flew
06.05.2011, 10:55
Hallo zusammen,

wenn ich eine gruppierende Abfrage auf das Feld Datum einer Tabelle ausführe, in der ich mir nach Monaten sowie Jahren gruppiere, kann es ja nunmal sein, dass in der zugrunde liegenden Tabelle für einen Monat kein Datum eingetragen ist, in der gruppierenden Abfrage also sagen wir der März 2011 fehlt.

Ich möchte allerdings eine Abfrage der Form:

MMonat, JJahr, SummeGeld
1 - 2011 - 100 €
2 - 2011 - 90 €
3 - 2011 - 0 €
4 - 2011 - 125 €

erhalten, also ich möchte den März mit ausgewiesen haben.
Bisher habe ich das über eine temporäre Tabelle, die ich dann mittels LEFT JOIN mit meiner Abfrage verknpüft habe, gelöst.
Jedoch verliert man ab und an den Überblick über die temp. Tabellen, ist es möglich, dies via VBA zu realisieren ohne temp. Tabelle ?

Die Abfrage ist nicht gespeichert, sie besteht aus SQL Code den ich in VBA als Grundlage für ein Unterformular verwende.


Grüße
flew

Micha_DU
06.05.2011, 11:06
Hi,

wo keine Daten vorhanden sind, kann Access sich auch keine ausdenken. Der Ansatz mit einer zusätzlichen Tabelle ist also in meinen Augen richtig. Aber warum ist die temporär? Ich würde einfach ne Tabelle tblMonat (oder tblJahr) anlegen mit den Feldern Jahr und Monat...Verknüpfung und entsprechende Kriterien sollten problemlos funktionieren

Micha_DU
06.05.2011, 11:07
Ergänzung:
in einer Kreuztabelle könntest du fixierte Spaltenüberschriften verwenden.

ebs17
06.05.2011, 11:09
ist es möglich, dies via VBA zu realisieren
Eine Abfrage, wenn das das Ziel ist, basiert auf Tabellen. Also müsstest Du Deine Daten auch erst in eine (temporäre) Tabelle schreiben.
Die Ermittlung und Erzeugung von "fehlenden" Datensätzen per VBA ist m.M. nach deutlich aufwändiger.
Jedoch verliert man ab und an den Überblick über die temp. Tabellen
Daher sollte man sich sehr zurückhalten mit temporären Tabellen, auch schon aus dem Grund, dass sie das Aufblähen der Datenbank forcieren.

Der Ansatz mit der Hilfstabelle ist doch aber ein sehr guter. Man dürfte mit einigen sehr wenigen und gut geplanten Hilfstabellen sehr weit kommen, und diese dürfen auch in der DB verbleiben (statisch) und über vorhandene Indices auch performant verwendbar sein.
Oder hast Du ein Speicherproblem?

Atrus2711
06.05.2011, 11:09
Hi,

wenn du nicht ohnehin eine feste Kalendertabelle brauchst, die man hier ausschlachten könnte, könntest du die temporäre Tabelle z.B. durch eine UNION der 12 Monate vermeiden:

SELECT 1 AS Bezugsmonat, Sum(...) AS Wert FROM ... WHERE Datumsfilter
UNION ALL
SELECT 2, Sum(...) FROM ... WHERE Datumsfilter
UNION ALL
SELECT 3, Sum(...) FROM ... WHERE Datumsfilter
...
etc.

Aber ob das schöner ist? Und v.a. schneller? Eher nicht.

"Überblick verlieren" ist auch kein Argument. Programmierung (und temp. Tabellen sind ja programmiert) braucht Übersicht. Es gibt Mittel und Wege, die Übersicht zu behalten oder wiederzugewinnen.

flew
06.05.2011, 11:51
Hallo,

@Micha: mit temporär meinte ich Tabellen, welche Daten nur für Darstellungszwecke beinhalten, je nach Bedarf fülle ich diese temp. Tabs auch mit anderen Werten, bennenen tue ich sie für gewöhnlich "tbl_TempXxxYyy", damit diese Tabs als allererste aufgeführt werden. Andere Tabellen bennene ich ohne Unterstrich und ohne "Temp"

@Eberhard: Nein ein Speicherproblem habe ich nicht, ich werde wohl dennoch meine temp. Tabs mal durchgehen müssen, ob ich da keine doppelten, dreifachen ... erstellt habe.

Ich danke euch für eure Vorschläge / Meinungen, manchmal frage ich nur gerne um zu erfahren, wie Leute mit mehr Erfahrung es lösen, aber dann bin ich diesmall ja nciht allzu verkehrt.

Danke und Grüße
flew

Atrus2711
06.05.2011, 12:01
Hi,

vielleicht hilft es dir, wenn die temporären Tabellen auch wirklich nur temporär sind bzw. in einer temporären Datenbank liegen. Diese temporäre Datenbank ist eine vollwertige Datenbank, aber sie wird eben von einer Klasse verwaltet. Die DB entsteht, sobald eine Instanz der Klasse erzeugt wird und wird gelöscht, sobald die Instanz vernichtet wird. Während der Lebenszeit der Instanz ist die DB voll nutzhbar und kann z.B. über eingebundene Tabellen genutzt werden, um bisherige "lokale Temptabellen" in ein temporäres backend auszulagern.

Such mal nach clsTempDB hier im Forum.

flew
06.05.2011, 12:22
Jo, dankeschön, ich werde mir das mal anschauen !