# Gruppieren nach Jahr und Monat, angezeigt werden soll der 1.Tag im Monat um 00:00



## charlie2009 (14. September 2009)

Hallo,

das ist der erste Eintrag in diesem Forum und ich hoffe Ihr könnt mir weiterhelfen. Mein Problem bekomme ich einfach nicht gelöst.

Ich habe eine mySQL DB wo zu jeder vollen Stunde ein Datensatz hinzukommt. Nun möchte ich die Datensätze nach Jahren und Monaten gruppieren, was auch schon funktioniert. 


```
SELECT *
FROM `table`
where year(datum) >'2007'
GROUP BY YEAR(`datum`), MONTH(`datum`)
```

Das Problem ist nur, dass der gruppierte Monat den erste Tag zur ersten Stunde, also im Format  'YYYY-MM-01 00:00:00'  anzeigen soll. Das hat die ersten Monate scheinbar zufällig mit der obrigen Abfrage funktioniert, aber seit 3 Monaten steht als Ergebnis irgend ein Tag dort. 

Habt Ihr eine Idee, wie man das machen könnte?

MfG
Charlie2009


----------



## RaVenC (14. September 2009)

Hmm
warum möchtest du das Gruppieren?
Zum ordnen?
Wenn ja, dann könntes du mal das versuchen:


```
SELECT *
FROM `table`
where year(datum) >'2007'
ORDER BY UNIX_TIMESTAMP(datum) ASC
```
bzw DESC wenn es absteigend sein soll 

Ansonsten:

```
SELECT *
FROM `table`
where year(datum) >'2007'
GROUP BY YEAR(`datum`), MONTH(`datum`), DAY(`datum`), HOUR(`datum`)
```


----------



## charlie2009 (14. September 2009)

Danke für die Antwort, aber geht leider noch nicht.

Also mit der richtigen SQL Ausgabe mache ich noch einen Left Join, der aber nur funktioniert, wenn der erste des Monat und 00:00 angezeigt wird. Die Select Abfrage ist auch nur ein Beispiel. Dort werden normalerweise die Summen und Durchschnittswerte vom ganzen Monat erfasst. Ich habe das nur nicht erwähnt, um keine Verwirrung zu stiften.

Mfg
Charlie2009


----------



## Matthias Reitinger (14. September 2009)

Hallo,

wenn ein Datensatz für jede Stunde existiert, dann müsste es doch reichen, anstatt `datum` einfach MIN(`datum`) zu selektieren, oder?

Grüße, Matthias


----------



## charlie2009 (14. September 2009)

Ja, er zeigt es dann zwar an, aber mir fehlt der "link2", der nur am ersten um 00:00 vorhanden ist. Mit dem Wert sollte dann ein Left Join gemacht werden. 


```
id 	datum	              wert1	wert2	link1	link2
7364 	2009-01-01 00:00:00 	62 	-4 	3 	3
8108 	2009-02-01 00:00:00 	45 	-1 	4 	3
8780 	2009-03-01 00:00:00 	3 	6 	4 	3
9524 	2009-04-01 00:00:00 	0 	4 	5 	4
10244 	2009-05-01 00:00:00 	0 	11 	5 	4
10988 	2009-06-01 00:00:00 	0 	16 	5 	4
11708 	2009-07-01 00:00:00 	0 	19 	5 	4
15494 	2009-08-31 21:00:00 	0 	18 	5 	0
15793 	2009-09-13 08:00:00 	0 	14 	5 	0
```

Im Datensatz mit der ID vom ersten Tag des Monats um 00:00 Uhr steht auch ein link2 und diesen brauche ich, um einen Left Join zu machen. Es geht also nicht nur um die reine Anzeige. Komischerweise funktioniert es seit 2 Monaten nicht mehr. Es muss also so gruppiert werden, dass der erste Datensatz des Monats angezeigt wird. Die Werte1 und 2 kann ich mir dann mit Sum() um AVG() für den Monat errechnen lassen.

MfG
Charlie2009


----------



## Matthias Reitinger (14. September 2009)

Hallo,

dann probier es mal so:

```
SELECT * FROM `table`
WHERE `datum` IN (
  SELECT MIN(`datum`) FROM `table`
  WHERE YEAR(`datum`) > 2007
  GROUP BY YEAR(`datum`), MONTH(`datum`)
)
```

Grüße, Matthias


----------



## charlie2009 (15. September 2009)

Hallo,

bei der Abfrage stürzt phpmyadmin regelrecht ab. Deshalb habe ich gestern auch nicht mehr geantwortet, weil ich dann jedesmal keinen Zugriff mehr hatte. Heute habe ich es auf meinem lokalen Rechner getestet und es passiert das gleiche. Erst nachdem ich Firefox neu starte kann ich wieder auf die DB zugreifen.

MfG
Charlie2009


----------

