# SQL - Nach Jahr gruppieren



## Sasser (19. August 2009)

Guten Tag!

Ich versuche verzweifelt eine Statistik zu erstellen. Und zwar befindet sich das Datum im Format "mm-dd-jjjj" in meiner DB. Nun möchte ich gern nach Jahr gruppieren. Allerdings will es einfach nicht, was mache ich falsch?


```
$result = mysql_query ( "SELECT DATE_FORMAT(`date`, '%Y') AS item, SUM(`amount`) AS amounts FROM transactions GROUP BY item ORDER BY item ASC" );
```

Es wird mir immer nur 1 Datensatz ausgegeben, obwohl es mindestens 3 sein müssten!?


----------



## Parantatatam (19. August 2009)

Nimm das GROUP BY `item` raus.


----------



## Sasser (19. August 2009)

Hmm nun bekomme ich überhaupt nichts mehr augegeben!?


```
$result = mysql_query ( "SELECT DATE_FORMAT(`date`, '%Y') AS item, SUM(`amount`) AS amounts FROM transactions ORDER BY item ASC" );
```


----------



## Parantatatam (19. August 2009)

Mein Fehler. Du musst natürlich noch ein GROUP BY `amount` einfügen, da du doch von dieser Spalte die Summe haben.


----------



## Matthias Reitinger (19. August 2009)

einfach nur crack hat gesagt.:


> Mein Fehler. Du musst natürlich noch ein GROUP BY `amount` einfügen, da du doch von dieser Spalte die Summe haben.


Das ergibt doch keinen Sinn. Dann werden alle Einträge mit gleichem amount zu einer Zeile zusammengefasst.

@Sasser: Welchen Datentyp hat die Spalte item? Welche Ausgabe erzeugen deine Abfragen genau?


----------



## kuddeldaddeldu (19. August 2009)

Hi,

die Abfrage schlägt ja auch fehl, wenn man die Gruppierung rausnimmt. Ohne Gruppierung keine Aggregation.
Du bist nun übrigens auch schon so lange dabei, dass man Dir doch nicht jedesmal sagen muss, dass in der Entwicklungsphase das error_reporting aufgedreht gehört und MySQL-Fehler mit mysql_error() ausgegeben werden...

Was steht denn nach Deiner ursprünglichen Abfrage in "item"?

LG


----------



## Parantatatam (19. August 2009)

Stimmt, das wird auch nicht funktionieren. Nun, dann weiß ich auch nicht weiter.


----------



## kuddeldaddeldu (19. August 2009)

Es ist doch einfach nur das Format des Datums falsch, wie man sicherlich leicht am Ergebnis von DATE_FORMAT erkennen kann...
Wenn man es in der DB nicht umstellen will, lässt sich das aber mit STR_TO_DATE() in der Abfrage lösen.

LG


----------



## Sasser (19. August 2009)

"item" ist das zuvor definierte:


```
DATE_FORMAT(`date`, '%Y') AS item
```

Ich nutze aber das Datumsformat schon immer in diesem Format. In einem früheren Threat wurde mir sogar dazu geraten und ich habe das komplette System danach umgestellt!?

Es muss doch möglich sein, aus dem Datum das Jahr herauszufiltern und dann danach zu gruppieren oder?


----------



## Matthias Reitinger (19. August 2009)

Hallo,

entschuldige, ich meinte natürlich den Datentyp des Feldes date. Das Ergebnis deiner Abfragen bist du uns aber noch schuldig.

Grüße, Matthias


----------



## Mark (19. August 2009)

Hi!


```
DATE_FORMAT(`date`, '%Y') AS item
```
...muß die Spalte (das Feld) "date" nicht ohne Anführungszeichen angegeben werden? So ergibt die Anfrage bei mir immer "NULL" (, da wohl 'date' als Datums-String interpretiert wird)...?

Liebe Grüße,
Mark.

//edit: oh, Danke, kuddeldaddeldu, mit diesen Backticks geht's natürlich auch bei mir ... wieder was gelernt, vielen Dank!


----------



## kuddeldaddeldu (20. August 2009)

Hi Mark,

das sind Backticks:

*`*
Die dienen in MySQL als Begrenzer für Tabellen- und Spaltennamen. So kann man auch Schlüsselwörter als Bezeichner verwenden. 

@Sasser: Ich wollte das _Ergebnis_ wissen. Wie Du item definierst, sagtest Du bereits. Den Typ von date bist Du auch noch schuldig...
Und wer hat Dir dazu geraten, ein Datum in MySQL im Format 'mm-dd-jjjj' zu speichern? Ein Datum speichert man als DATE oder DATETIME und damit hat es das Format YYYY-MM-DD. 

LG


----------



## Sasser (20. August 2009)

Sorry, war eine falsche Aussage von mir! Ich habe in einer anderen Tabelle das Datum im Format: yyyy-mm-dd wie auch mir hier geraten wurde!

Nur leider habe ich in meiner neuen Tabelle mich verschrieben und habe das Datum im Format: mm-dd-yyyy gespeichert. Ich werde es umschreiben und dann nochmal testen!

// Edit: Das Format des Feldes ist "varchar" und damit arbeite ich auch in anderen Tabellen und es funktioniert!

Folgendes ergibt nun mein erhofftes Resultat:


```
$result = mysql_query ( "SELECT DATE_FORMAT(`date`, '%Y') AS item, SUM(`amount`) AS amounts FROM transactions GROUP BY DATE_FORMAT(`date`, '%Y') ORDER BY DATE_FORMAT(`date`, '%Y') ASC" );
```

Vielen Dank für eure Hilfe!


----------



## Sasser (20. August 2009)

Eine Frage dazu habe ich noch:

Kann man, wenn man nach Monaten gruppiert, anstatt der Nummer des Monats den Namen ausgeben?


----------



## kuddeldaddeldu (20. August 2009)

Hi,

wie wär's, wenn Du einfach mal in die Datums- und Zeitfunktionen schaust? DATE_FORMAT() hast Du ja schließlich schon gefunden...
Ein Datum als varchar zu speichern ist übrigens Käse. Und "funktionieren" ist da eher Definitionssache. Hättest Du das extra dafür vorgesehene DATE genommen, hättest Du beim Eintragen von Datensätzen sofort bemerkt, dass mm-dd-jjjj das falsche Format ist...

LG


----------



## dbwizard (20. August 2009)

Sasser hat gesagt.:


> // Edit: Das Format des Feldes ist "varchar" und damit arbeite ich auch in anderen Tabellen und es funktioniert!




HI,

Datum als String oder was auch immer zu speichern, ist *BAD/UGLY/EVIL *. Wenn du das korrekte Format verwendet hättest, wäre dieser ganze Tread hier uberflüssig gewesen.


Gruss


----------

