Abfrage über mehrere Tabellen mit unterschiedlichen Datumseinträgen

Abfrage über mehrere Tabellen mit unterschiedlichen Datumseinträgen

am 18.04.2007 20:17:25 von Christian Koenig

Hallo Zusammen,

ich habe 3 Tabellen mit Artikelverkäufen.
In jeder dieser Tabellen ist auch das Verkaufsdatum enthalten.
Es wird aber nicht in jeder Tabelle an jedem Tag ein Verkauf gemacht.
Ich brauche eine Abfrage mit den Tagesumsätzen, auch mit den Tagen an
denen keine Umsätze gemacht wurden.
Wenn ich einen
SELECT ...
FORM t1
LEFT JOIN t2 on ....
LEFT JOIN t3 on ....
mache, dann werden nur die Tage berücksichtigt die auch in t1 vorkommen.
Ich brauche also eine Bezugstabelle mit allen Tagen.
Da gibt es aber sicher eine schlaue Lösung, damit ich in der Query
angeben kann von-bis welchen Tag an die Auswertung starten soll.
Ergebnis sollte zum Beispiel so aussehen
Datum|Umsatz_Shop1|Umsatz_Shop2|Umsatz_Shop3
1.Jän | 0.--|0.--|0.--
2.Jän | 23.-|0.--|34.--
etc..

Auf höherer Ebene könnte ich das Problem leicht löschen. z.B. Java
Klasse, die die einzelnen Tage durch iteriert. Aber mich würde schon
interessieren, ob ich es nicht gleich im SELECT Statement plazieren kann.
Vielen Dank für die Hilfe

Chris

Re: Abfrage über mehrere Tabellen mit unterschiedlichen Datumseinträgen

am 18.04.2007 20:43:32 von Dominik Echterbruch

Christian Koenig schrieb:
>
> ich habe 3 Tabellen mit Artikelverkäufen.
> In jeder dieser Tabellen ist auch das Verkaufsdatum enthalten.
> Es wird aber nicht in jeder Tabelle an jedem Tag ein Verkauf gemacht.
> Ich brauche eine Abfrage mit den Tagesumsätzen, auch mit den Tagen an
> denen keine Umsätze gemacht wurden.
> Wenn ich einen
> SELECT ...
> FORM t1
> LEFT JOIN t2 on ....
> LEFT JOIN t3 on ....
> mache, dann werden nur die Tage berücksichtigt die auch in t1 vorkommen.
>
> Auf höherer Ebene könnte ich das Problem leicht löschen. z.B. Java
> Klasse, die die einzelnen Tage durch iteriert. Aber mich würde schon
> interessieren, ob ich es nicht gleich im SELECT Statement plazieren kann.

Eine Lösung mit reinen SQL-Mitteln und ohne Zusatztabelle fällt mir
jetzt nicht ein, aber du könntest dir mal das Kapitel über die Stored
Procedures [1] im Handbuch [2] anschauen. Da steht eine Menge zu solchen
Problemen drin. Unter anderem kannst du durch die Ergebnismenge
iterieren und die Lücken auffüllen. Anschließend würde dir z.B. ein
SELECT umsatz();
genügen, um dir die Daten im gewünschten Format zu liefern.

[1] http://dev.mysql.com/doc/refman/5.0/en/stored-procedures.htm l
[2] http://dev.mysql.com/doc/refman/5.0/en/

Grüße,
Dominik

Re: Abfrage übermehrere Tabellen mit unterschiedlichen Datumseinträgen

am 18.04.2007 21:50:50 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Abfrage über mehrere Tabellen mit unterschiedlichen Datumseinträgen

am 18.04.2007 22:08:17 von Dominik Echterbruch

Andreas Kretschmer schrieb:
> begin Christian Koenig wrote:
>> Hallo Zusammen,
>
>> ich habe 3 Tabellen mit Artikelverkäufen.
>> In jeder dieser Tabellen ist auch das Verkaufsdatum enthalten.
>> Es wird aber nicht in jeder Tabelle an jedem Tag ein Verkauf gemacht.
>> Ich brauche eine Abfrage mit den Tagesumsätzen, auch mit den Tagen an
>> denen keine Umsätze gemacht wurden.
>
> Klingt nach einer Anwendung von generate_series(). Hat MySQL nicht, ich
> weiß. Könnte man sich aber sicherlich auch dort irknwie basteln.

Guter Hinweis. Mit der von mir erwähnten Stored Procedure sollte das ja
kein Problem mehr sein. Einfach Zeitraum angeben und das Teil spuckt die
passenden Daten (Datums, Datümer oder was auch immer) aus.

> test=*# select (current_date + (s || 'days')::interval)::date from generate_series(0,10) s;

Das sähe in MySQL selbstverständlich eleganter aus ;)

Grüße,
Dominik

Re: Abfrage über mehrere Tabellen mit unterschiedlichen Datumseinträgen

am 18.04.2007 22:51:16 von Christian Koenig

Vielen Dank für die Infos. Klingt aber nach 5.0 oder höher
Habe auf meinem System leider noch 4.1 (keine SP soviel ich weis) und
ein update will ich nicht wirklich machen.
Also 4.1 workaround wäre perfekt.
Gruß
Christian


Dominik Echterbruch schrieb:
> Andreas Kretschmer schrieb:
>> begin Christian Koenig wrote:
>>> Hallo Zusammen,
>>
>>> ich habe 3 Tabellen mit Artikelverkäufen.
>>> In jeder dieser Tabellen ist auch das Verkaufsdatum enthalten.
>>> Es wird aber nicht in jeder Tabelle an jedem Tag ein Verkauf gemacht.
>>> Ich brauche eine Abfrage mit den Tagesumsätzen, auch mit den Tagen an
>>> denen keine Umsätze gemacht wurden.
>>
>> Klingt nach einer Anwendung von generate_series(). Hat MySQL nicht, ich
>> weiß. Könnte man sich aber sicherlich auch dort irknwie basteln.
>
> Guter Hinweis. Mit der von mir erwähnten Stored Procedure sollte das ja
> kein Problem mehr sein. Einfach Zeitraum angeben und das Teil spuckt die
> passenden Daten (Datums, Datümer oder was auch immer) aus.
>
>> test=*# select (current_date + (s || 'days')::interval)::date from
>> generate_series(0,10) s;
>
> Das sähe in MySQL selbstverständlich eleganter aus ;)
>
> Grüße,
> Dominik

Re: Abfrage übermehrere Tabellen mit unterschiedlichen Datumseinträgen

am 19.04.2007 07:24:24 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de