Archiv verlassen und diese Seite im Standarddesign anzeigen : Datum und GROUP BY
squirrelcgn 11-03-2010, 23:02 Hallo zusammen,
habe einen table, der unter anderem die column "tstamp" enthält. Dort sind - wie der Name schon sagt - timestamps im UNIX-timestamp-format drin (0000-00-00 00:00:00).
Jetzt möchte ich Auswertungen gruppiert nach Monat machen und zwar derart, dass die Form immer "YYYY-MM" lautet, also z.B. 2010-03 für März 2010.
Wie aber kann ich YEAR(x) und MONTH(y) miteinander kombinieren, und zwar nicht "nur" auf String-Ebene, sondern eben auch auf der logischen Ebene?
Danke und Grüße,
Chris
SELECT
DATE_FORMAT(spalte, '%Y-%m') AS monat
FROM
tabelle
GROUP BY
YEAR(spalte), MONTH(spalte)
squirrelcgn 11-03-2010, 23:12 Danke, h3ll! Aber das ist mir schon klar, meine Problembeschreibung ist einfach Mist, sorry! ;-)
Wie bekomme ich die beiden Teile dann ZUSAMMEN in ein Feld? Also wie geschrieben, z.B. "2010-01", "2010-02", "2010-03"...?
EDIT: Problem gelöst! CONCAT_WS() erledigt den Job!
squirrelcgn 11-03-2010, 23:31 Möchte noch eine kleine Erweiterung vornehmen:
Es werden ja momentan "nur" solche Monate gelistet, die auch tatsächlich existieren (bzw. für die auch tatsächlich Zeilen existieren). Anders formuliert: es erscheint nur ein "2010-02", wenn für den Februar 2010 auch mindestens eine Zeile existiert... logisch. (Ich gebe also immer den Monat an (2010-02) und daneben werden alle Zeilen, die zu diesem Monat gehören gezählt.)
Wie kann ich aber jetzt auch solche Monate auflisten, zu denen KEINE Zeile existiert? Also wie kann ich es hinkriegen, dass wenn es KEINE Zeile für Februar 2010 gibt, dort "2010-02" => "0" steht (also einfach "0" als Count). (Ziel: habe immer ein Zeitintervall von mehreren Monaten und möchte auch für jeden Monat einen Eintrag haben, auch wenn dieser Eintrag "0" ist.)
Das ist eine grundsätzliche Frage, aber wäre super, wenn mir jemand hier eine "good practice" verrät, vielleicht sogar aus eigener Erfahrung?
Danke und LG,
Chris
Es wäre bad practice, datenbank-seitig Daten „erfinden“ zu wollen, die einfach nicht vorhanden sind.
Wenn du das nur bei der Ausgabe haben willst - dann durchlaufe einfach den Zeitraum in einer Schleife. Wenn es einen Eintrag aus der Datenbank für den Monat gibt, gib den zugehörigen Wert aus - und sonst eine Null.
squirrelcgn 12-03-2010, 00:12 Das ist wah(r)! ;-) Danke!
Ich will natürlich die DB nicht verändern, sondern nur einen Report generieren. Will aber OHNE PHP auskommen, mit PHP ist das ganze ein Kinderspiel...
Aber es gibt keine "offziellen" for-/while-Schleifen in MySQL, oder?
AmicaNoctis 12-03-2010, 00:28 Aber es gibt keine "offziellen" for-/while-Schleifen in MySQL, oder?
Doch, aber nur innerhalb von Triggers, Stored Procedures und Stored Functions. In deinem Falle wäre das zwar ein Weg, aber der ist so dreckig, dass ich dir nur raten kann, trotzdem PHP zur Hand zu nehmen.
squirrelcgn 12-03-2010, 17:33 Danke, Amica. Aber das klingt für mich irgendwie total übertrieben / wie mit "Kanonen auf Spatzen geschossen". Will weder TRIGGER/STORED... noch PHP verwenden. Das MUSS gehen... ;-)
Habe aber noch eine weitere Idee: ich erstelle eine "temporäre Tabelle", die ALLE Monate meines betrachteten Intervall enthält (also sowohl die, bei denen COUNT() > 0, also auch die bei denen COUNT() = 0). Dann mache ich ein JOIN über meine ursprüngliche Tabelle und die temp-Tabelle und FERTIG.
Sieht jemand ein Problem?
squirrelcgn 12-03-2010, 20:05 Stehe kurz vor der Lösung des Problems. Aber jetzt brauche ich nochmal einen Tipp (oder vielleicht sogar Tritt)... ;-)
(1.) Tabelle "base"
http://img714.imageshack.us/img714/8094/basebo.png
(2.) Abfrageergebnis
http://img17.imageshack.us/img17/5021/resultb.png
FRAGE: wie gestalte ich einen JOIN so, dass das Result wie folgt aussieht:
2006-07 0
2006-08 0
2006-09 0
2006-10 6
2006-11 0
2006-12 2
...
also bei den Zeilen, zu denen kein COUNT existiert (der COUNT also 0 ist) soll auch "0" eingetragen werden...
Danke für jeden Tipp!
LG,
Chris
AmicaNoctis 12-03-2010, 20:52 Du kombinierst diese "base"-Tabelle über einen LEFT JOIN mit der anderen.
|
|