Newbie: Monate ohne Resultat auffüllen- wie?
Newbie: Monate ohne Resultat auffüllen- wie?
am 22.02.2007 22:07:46 von df4or
Tag.
Wieder mal eine Newbiefrage. Bitte keine fertigen SQL-Statements, das würde
nur meine Faulheit fördern. Ich suche mehr nach Hinweisen wie 'man' sowas
ordentlich macht, da lerne ich mehr bei. Danke.
Aufgabe
-------
Eine Tabelle enthält
Auftragsnummer,
Auftragsdatum,
Artikel_id,
Artikel_menge.
Ich möchte nun eine Graphik über den Abverkauf eines bestimmten Artikels
über die Zeit, gruppiert nach Monaten erstellen. Trivial.
SELECT SUM( art_menge ) , DATE_FORMAT( DATE, '%Y-%m' ) AS mnth
FROM `rel_ord_art`
WHERE art_id =16
GROUP BY mnth
ORDER BY mnth ASC
Prima, das bringt mir das gewünschte Ergebnis. Mit dem kleinen
Schönheitsfehler, das Monate, in denen der Artikel überhaupt nicht verkauft
wurde, nicht im Ergebnis auftauchen. Das macht dann die Graphik ziemlich
unübersichtlich.
Wie fügt man also nun die Monate mit Null-Ergebnis ein?
Lösungsansatz?
--------------
Meine naive Idee ist nun, eine einspaltige 'Hilfstabelle' zu verwenden, die
einfach alle möglichen Monate enthält und diese Tabelle mit der obigen
Abfrage zu verknüpfen (wohl über ein Subselect). So würde ich alle Monate
angucken und auch als Resultat erhalten, auch wenn in manchen Monaten das
Ergebnis Null ist.
Was mir an dieser Lösung nicht gefällt, ist das ich die Hilfstabelle mit
jedem neuen Monat erstmal erweitern müsste, oder sie einmal bis zum St.
Nimmerleinstag anlege. Was ich für unständlich bzw. wenig elegant halte.
Ist das ein üblicher Lösungsweg für sowas? Oder gibt es eine elegantere
Methode? Mit MySQL 5.0.xxx.
Danke für Hinweise.
GruÃ,
Ekki
Re: Newbie: Monate ohne Resultat auffüllen - wie?
am 22.02.2007 23:10:42 von Dominik Echterbruch
Ekki Plicht (DF4OR) schrieb:
>
> Wieder mal eine Newbiefrage. Bitte keine fertigen SQL-Statements, das würde
> nur meine Faulheit fördern. Ich suche mehr nach Hinweisen wie 'man' sowas
> ordentlich macht, da lerne ich mehr bei. Danke.
Fertige SQLs gibt's hier eh nur selten ;) Aber auf jeden Fall ein sehr
löblicher Ansatz!
> SELECT SUM( art_menge ) , DATE_FORMAT( DATE, '%Y-%m' ) AS mnth
> FROM `rel_ord_art`
> WHERE art_id =16
> GROUP BY mnth
> ORDER BY mnth ASC
>
> Prima, das bringt mir das gewünschte Ergebnis. Mit dem kleinen
> Schönheitsfehler, das Monate, in denen der Artikel überhaupt nicht verkauft
> wurde, nicht im Ergebnis auftauchen. Das macht dann die Graphik ziemlich
> unübersichtlich.
>
> Wie fügt man also nun die Monate mit Null-Ergebnis ein?
Die einfache und schnelle Lösung ist, in der Applikation über die
Ergebniszeilen zu iterieren (mußt du ja vermutlich eh, um die Grafik zu
erstellen) und alle fehlenden Monate dort einzufügen.
Die (wie ich finde) elegante Lösung ist, die Abfrage nebst Iteration von
einer Stored Procedure erledigen zu lassen. Dort kannst mit Hilfe eines
Cursors (wie bei einer Schleife in einer "normalen" Programmiersprache)
das Ergebnis der Abfrage durchlaufen und die fehlenden Werte einsetzen.
Schicker Nebeneffekt der zweiten Lösung: Ein simples und übersichtliches
"SELECT werte_fuer_grafik();" liefert dir alles, was du brauchst.
Mist, jetzt hab ich ja doch ein fertiges SQL geliefert... ;)
Grüße,
Dominik
Re: Newbie: Monate ohne Resultat auffüllen- wie?
am 23.02.2007 07:01:00 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
Re: Newbie: Monate ohne Resultat auffüllen - wie?
am 23.02.2007 08:41:59 von Christian Kirsch
Dominik Echterbruch schrieb:
> Ekki Plicht (DF4OR) schrieb:
>> Wieder mal eine Newbiefrage. Bitte keine fertigen SQL-Statements, das würde
>> nur meine Faulheit fördern. Ich suche mehr nach Hinweisen wie 'man' sowas
>> ordentlich macht, da lerne ich mehr bei. Danke.
>
> Fertige SQLs gibt's hier eh nur selten ;) Aber auf jeden Fall ein sehr
> löblicher Ansatz!
>
Hallo Dominik,
es wäre vielleicht sinnvoll, wenn Du Deinen Newsreader so konfigurieren
könntest, dass er auf UTF-8-Postings wie das von Ekki auch in UTF-8
antwortet? So jedenfalls (Ekki: UTF-8, Du: ISO-8859-15) sehen Ekkis
Ümläute kapott aus.
Christian
Re: Newbie: Monate ohne Resultat auffüllen- wie?
am 23.02.2007 14:03:33 von Harald Fuchs
In article ,
"Ekki Plicht (DF4OR)" writes:
> Tag.
> Wieder mal eine Newbiefrage. Bitte keine fertigen SQL-Statements, das w=
ürde
> nur meine Faulheit fördern. Ich suche mehr nach Hinweisen wie 'man' sow=
as
> ordentlich macht, da lerne ich mehr bei.
Da biste hier falsch - hier gibt es nur Newbies, die zu blöd oder zu
faul zum Selbermachen sind, und genervte Regulars ;-)
> Lösungsansatz?
> --------------
> Meine naive Idee ist nun, eine einspaltige 'Hilfstabelle' zu verwenden, d=
ie
> einfach alle möglichen Monate enthält und diese Tabelle mit der obige=
n
> Abfrage zu verknüpfen (wohl über ein Subselect).
Besser ein OUTER JOIN.
> So würde ich alle Monate
> angucken und auch als Resultat erhalten, auch wenn in manchen Monaten das
> Ergebnis Null ist.
> Was mir an dieser Lösung nicht gefällt, ist das ich die Hilfstabelle =
mit
> jedem neuen Monat erstmal erweitern müsste, oder sie einmal bis zum St.
> Nimmerleinstag anlege. Was ich für unständlich bzw. wenig elegant hal=
te.
Elegant ist es sowieso nicht, solange MySQL kein generate_series() kennt.
Um das Tabellenerweitern kommst Du aber recht einfach herum: erzeuge
einmal eine Hilfstabelle mit den Zahlen von z.B. 1 bis 100000, die
dann für alle derartigen Aufgaben verwendet werden kann. Dazu mußt Du
die Query natürlich so umbauen, daß die Spalte der Hilfstabelle vor
dem OUTER JOIN in das passende Datumsformat konvertiert wird sowie im
WHERE die passende Zeilenanzahl der Hilfstabelle auftaucht.
Re: Newbie: Monate ohne Resultat auffüllen - wie?
am 23.02.2007 23:37:20 von Dominik Echterbruch
Christian Kirsch schrieb:
> Dominik Echterbruch schrieb:
>> Ekki Plicht (DF4OR) schrieb:
>>> Wieder mal eine Newbiefrage. Bitte keine fertigen SQL-Statements, das wÃÅrde
>>> nur meine Faulheit fördern. Ich suche mehr nach Hinweisen wie 'man' sowas
>>> ordentlich macht, da lerne ich mehr bei. Danke.
>> Fertige SQLs gibt's hier eh nur selten ;) Aber auf jeden Fall ein sehr
>> löblicher Ansatz!
>
> es wäre vielleicht sinnvoll, wenn Du Deinen Newsreader so konfigurieren
> könntest, dass er auf UTF-8-Postings wie das von Ekki auch in UTF-8
> antwortet? So jedenfalls (Ekki: UTF-8, Du: ISO-8859-15) sehen Ekkis
> Ãmläute kapott aus.
Alles neu macht die Eistaube... Habe das Ding jetzt komplett auf UTF-8
umgestellt. Ist es besser geworden?
Danke jedenfalls für den Hinweis, Christian!
GrüÃe,
Dominik