| SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden. |
 |

11-03-2010, 22:02
|
|
squirrelcgn
Registrierter Benutzer
|
|
Registriert seit: Sep 2005
Ort: koeln.nrw.de
Beiträge: 125
|
|
Datum und GROUP BY
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
|

11-03-2010, 22:11
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Code:
SELECT
DATE_FORMAT(spalte, '%Y-%m') AS monat
FROM
tabelle
GROUP BY
YEAR(spalte), MONTH(spalte)
Geändert von h3ll (11-03-2010 um 22:14 Uhr)
|

11-03-2010, 22:12
|
|
squirrelcgn
Registrierter Benutzer
|
|
Registriert seit: Sep 2005
Ort: koeln.nrw.de
Beiträge: 125
|
|
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!
Geändert von squirrelcgn (11-03-2010 um 22:16 Uhr)
|

11-03-2010, 22:31
|
|
squirrelcgn
Registrierter Benutzer
|
|
Registriert seit: Sep 2005
Ort: koeln.nrw.de
Beiträge: 125
|
|
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
Geändert von squirrelcgn (11-03-2010 um 22:37 Uhr)
|

11-03-2010, 23:02
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
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.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

11-03-2010, 23:12
|
|
squirrelcgn
Registrierter Benutzer
|
|
Registriert seit: Sep 2005
Ort: koeln.nrw.de
Beiträge: 125
|
|
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?
|

11-03-2010, 23:28
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von squirrelcgn
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.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

12-03-2010, 16:33
|
|
squirrelcgn
Registrierter Benutzer
|
|
Registriert seit: Sep 2005
Ort: koeln.nrw.de
Beiträge: 125
|
|
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?
Geändert von squirrelcgn (12-03-2010 um 16:39 Uhr)
|

12-03-2010, 19:05
|
|
squirrelcgn
Registrierter Benutzer
|
|
Registriert seit: Sep 2005
Ort: koeln.nrw.de
Beiträge: 125
|
|
Stehe kurz vor der Lösung des Problems. Aber jetzt brauche ich nochmal einen Tipp (oder vielleicht sogar Tritt)... ;-)
(1.) Tabelle "base"
(2.) Abfrageergebnis
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
|

12-03-2010, 19:52
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Du kombinierst diese "base"-Tabelle über einen LEFT JOIN mit der anderen.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|