Wie mit diesem Datum umgehen?

Hallo zusammen… Bin neu hier :wink:
Wie kann man eine Abfrage sinnvoll basteln, die folgende Daten zurückgibt.

Ich habe eine Tabelle mit dem Aufbau:

Datum | Umsatz
08.10.08 | 65,00
01.01.09 | 12,00
05.01.09 | 15,00
12.02.09 | 30,00

Nun möchte ich gern als SQL Ergebnis bekommen:

Datum | Umsatz
Oktober 08 | 65,00
Januar 09 | 37,00
Februar 09 | 30,00

Hat jemand ne Idee für sone Abfrage? Wie gruppiert man das am Besten? Eventuell mit Substring den Monat und das Jahr holen und danach gruppieren?Woher kriegt man dann aber am Besten die Monatsnamen?..

Wenn jemand helfen kann, wär ich super dankbar! :wink:

Hier ist fast alles möglich, mit etwas Vorbereitungen.
Zuerst musst du PostgreSQL beibringen, wie dein Datumsformat ausschaut:

SET DateStyle = 'DMY';

Danach noch deutsche Bezeichungen:

SET lc_time = 'de_DE.UTF-8';

Jetzt steht der Ausgabe schon nichts mehr im Weg:

SELECT to_char('08.10.08': :D ATE, 'FMMonth YY');
  to_char
------------
 October 08
(1 row)

Jepp, sogar daß ich deine halbe Antwort vervollständige, denn es fehlt die Gruppierung:

test=*# select * from umsatz ;
    tag     | umsatz
------------+--------
 2008-12-24 |    100
 2009-01-10 |     50
 2009-01-20 |    200
 2009-02-25 |    225
(4 rows)

test=*# select to_char(tag, 'FMMonth YY'), sum(umsatz) from umsatz group by 1 order by 1;
   to_char   | sum
-------------+-----
 December 08 | 100
 February 09 | 225
 January 09  | 250
(3 rows)

Kleiner Schönheitsfehler: es kommen leider keine lokalisierten Monatsnamen. Also fixe ich das auch mal noch schnell:

test=# SET lc_messages = 'de_DE.UTF-8';
SET
test=*# select * from umsatz ;
    tag     | umsatz
------------+--------
 2008-12-24 |    100
 2009-01-10 |     50
 2009-01-20 |    200
 2009-02-25 |    225
 2009-03-10 |    100
(5 rows)

test=*# select to_char(tag, 'TMMonth YY'), sum(umsatz) from umsatz group by 1 order by 1;
   to_char   | sum
-------------+-----
 Dezember 08 | 100
 Februar 09  | 225
 Januar 09   | 250
 März 09     | 100

@ads: TM, nicht FM, und lokalisierte Monatsnamen basieren auf lc_messages, nicht auf lc_time.


Andreas

Als Bonus mal noch eine Version, die auch Monate anzeigt, in denen kein Umsatz war (was wir Dir natürlich nicht wünschen…):

test=*# select to_char(foo.monat, 'TMMonth YY') as monat, sum(umsatz) from (select '2008-01-01'::date + n*'1month'::interval as monat from generate_series(0,23)n) foo left join umsatz on (to_char(umsatz.tag,'TMMonth YY')=to_char(foo.monat,'TMMonth YY')) group by foo.monat order by foo.monat;
    monat     | sum
--------------+-----
 Januar 08    |
 Februar 08   |
 März 08      |
 April 08     |
 Mai 08       |
 Juni 08      |
 Juli 08      |
 August 08    |
 September 08 |
 Oktober 08   |
 November 08  |
 Dezember 08  | 100
 Januar 09    | 250
 Februar 09   | 225
 März 09      | 100
 April 09     |
 Mai 09       |
 Juni 09      |
 Juli 09      |
 August 09    |
 September 09 |
 Oktober 09   |
 November 09  |
 Dezember 09  |
(24 rows)

So, nu is aber gut…


Andreas

Hehe super Sache, danke schön!

Habt mir sehr geholfen! ;-))

Grüße w3bbY

Stimmt auch wieder. Mein Beispiel war immer noch englisch und ich habe es nicht bemerkt.

Na, war wohl zu spät, Danke fürs Korrigieren.