Umsätze je Monat

Hallo,
Folgende Frage befasst sich mit folgender Datenbank: http://sql.idv.edu -> unter interaktive Abfrage ist die Datenbankstruktur angegeben.
Also ich brauche eine Übersicht der Umsätze je Monat, dass bekomm ich auch noch leicht hin, aber das prob is, ich brauch auch eine Jahres Spalte und sobald ich die dazunehme zerreist es mir die Umsätze da ich dann auch die Jahresspalte im Group by Statement brauche. Im moment schaut mein Statement so aus:
SELECT Month(Auftrag.Datum) AS Monat, Round(Sum(Auftragspos.Menge*Buch.Preis),2) AS “Umsatz je Monat”
FROM Auftrag, Auftragspos, Buch
WHERE Auftrag.Nr=Auftragspos.Auftragsnummer
AND Auftragspos.Buchnummer=Buch.Nr
GROUP BY Month(Auftrag.Datum)

Sobald ich hier nun noch die Jahresspalte integrieren will zerreist es mir das Ergebnis komplett:
SELECT Year(Auftrag.Datum) AS Jahr, Month(Auftrag.Datum) AS Monat, Round(Sum(Auftragspos.Menge*Buch.Preis),2) AS “Umsatz je Monat”
FROM Auftrag, Auftragspos, Buch
WHERE Auftrag.Nr=Auftragspos.Auftragsnummer
AND Auftragspos.Buchnummer=Buch.Nr
GROUP BY Month(Auftrag.Datum), Auftrag.Datum

ich glaube, du suchst Window-Funktionen:

test=*# select * from umsatz ;
   datum    | umsatz 
------------+--------
 2016-01-01 |     10
 2016-02-01 |     20
 2016-02-10 |     20
 2015-02-10 |     30
(4 rows)

test=*# select extract(year from datum) as jahr, to_char(datum, 'yyyy-mm') as monat,sum(umsatz) over (partition by extract(year from datum)) as jahresumsatz, sum(umsatz) over (partition by to_char(datum, 'yyyy-mm')) as monatsumsatz from umsatz ;
 jahr |  monat  | jahresumsatz | monatsumsatz 
------+---------+--------------+--------------
 2015 | 2015-02 |           30 |           30
 2016 | 2016-01 |           50 |           10
 2016 | 2016-02 |           50 |           40
 2016 | 2016-02 |           50 |           40
(4 rows)

Andreas

hmm weis nicht so ganz wie ich diesen Befehl auf dieses Datenbank Modell übertragen sollte:
https://sql.idb.edu/skalierbar/datenmodell_3.swf

gib Dir Mühe, Du willst ja auch was lernen :wink:

Problem ist, der Server Unterstützt kein to_char glaub ich. hab mehrere Varianten ausprobiert, gibt immer nur den Fehler: ERROR: Falsche Eingabe —> FUNCTION buch.to_char does not exist. aus :frowning: Gibts nichts einfaches wo ich aus so einem Datumsformat: yyyy-mm-dd 00:00:00 einfach nur yyyy und mm raushole?

Du brauchst für die Funktion to_char() kein Schema angeben. Probier mal als Test:

select to_char( current_date, 'yyyy-mm');

Jup, kommt wieder derselbe Errror :confused:
Da es nur eine Datenbankmodell für Einsteiger ist, dürften sie diese Funktion nicht implementiert haben ;(

Ah, es handelt sich um eine MySQL-Datenbank:

SELECT VERSION(), DATABASE();

Dann sollte das funktionieren:

SELECT DATE_FORMAT(CURDATE(), '%Y-%m');

Dann bist Du hier falsch. Hier geht’s um moderne Datenbanken

ahh ok sorry, kenn mich noch nicht wirklich aus xD dachte SQL = SQL :slight_smile:

Sollte man meinen, aber leider implementiert keine Datenbank den SQL Standard vollständig.

Und manche - wie MySQL - ignorieren ihn schlichtweg in weiten Bereichen und andere - wie Postgres - versuchen sehr eng am Standard zu bleiben.

Und gerade bei Datumsfunktionen bzw. beim Formatieren von einem Datum unterscheiden sie sich sehr - nicht zuletzt deswegen weil es dafür keinen Standard gibt.

Das Beispiel von akretschmer ist im Übrigen (mit Ausnahme der Funktion to_char) Standard SQL.