Summe pro Monat ermitteln???
-
Hallo,
ich versuche schon seit einiger Zeit folgende Daten aus meiner InterBase-DB zu bekommen. Und zwar gibt es zwei relevante Spalten in der Tabelle PRODUKTION, 'Datum' und 'Gewicht'.In diesen Spalten werden am Tag mehrere Gewichte eingetragen. Das sieht so aus '01.07.2006 , 21000 ; 01.07.2006 , 18000 ; 02.07.2006 , 12000 usw...
Jetzt möchte ich gern die SUMME der Gewichte pro Monat im Jahr ermitteln. Dazu habe ich folgenden Lösungsansatz:
select CAST(SUM(gewicht)/1000 as numeric (10,2)) as tonnen_1 from PRODUKTION where ((DATUM LIKE '%01_2006%')
Aber das geht nicht ganz. Er gibt mir immer NULL zurück?
Hat da jemand einen Vorschlag?
Gruß Torsten
-
Unter Oracle würd ichs so machen: (Musst evtl die SQL Syntax zur Datum->Char Konvertierung auf Interbase übersetzen)
select sum(gewicht), to_char(datum, 'YYYYMM') jahrmonat from produktion group by to_char(datum, 'YYYYMM')
So kriegst du alle Monate aller Jahre mit entsprechender Summe. Wenn du einen bestimmten Monat willst, fügst du natürlich einfach ein " where to_char(datum, 'YYYYMM') = '200601' " vors group by ein
-
hab#s so probiert:
select sum(gewicht) , CAST(datum '200501') jahrmonat from produktion group by cast (datum '200501')
Bringt mir leider an der Stelle ' nach dem ersten datum ein Token unknown
-
Hm, vielleicht der Alias? Probiers mit "CAST(datum '200501') as jahrmonat "
(edit)
Und das '200501' gehört doch eigentlich auch nicht dahin oder? Muss dort nicht das CAST Format stehen ? (YYYYMM oder sowas) Kenne den Interbase Dialekt leider nicht.
-
auch mit
CAST(datum '200501' as jahrmonat
gehts nicht. In meinem Buch über InterBase steht ein Beispiel für CAST:
select CAST((preis) as NUMERIC (15,2)) as brutto
Damit kann ich leider auch nichts anfangen.
-
man kann in Interbase keine Funktionen in Group by schreiben, da hilft wahrscheinlich nur ein View oder eine Procedure um das umzusetzen was du möchtest
oder du machst dir eine Hilfsspalte
ALTER TABLE produktion ADD datum_kurz COMPUTED BY ( EXTRACT (YEAR FROM datum) || EXTRACT (MONTH FROM datum) )
und machst dann
SELECT SUM(gewicht), datum_kurz FROM produktion GROUP BY datum_kurz
-
OK, gelesen und ausgeführt. Da gibt es nur ein Problem. Da es sich bei dem Feld 'datum_kurz' ja um ein VARCHAR handelt und ich die Summen im Monat pro Jahr berechnen möchte, gibt er mir mit
SELECT SUM(gewicht)/1000 as tonnen , datum_kurz FROM produktion where datum_kurz between 20061 and 200610 GROUP BY datum_kurz order by datum_kurz
leider auch die Summen von 200510-200512 aus (sprich Okt. 2005 bis Dez.2005).
Ist ja klar, da ich in der WHERE-Klausel ja zwischen 20061 - 200610 filtere und 200510 kleiner ist als 200610
Wenn man allerdings dem Monat Jan. - Sep. eine 0 voranstellen kann, könnte es ja klappen. Aber wie geht das???Gruß Torsten
-
dann versuchs mal so:
alter table produktion add datum_kurz computed by ((EXTRACT (YEAR FROM datum)*100) + (EXTRACT (MONTH FROM datum) ))
jetzt ist datum_kurz eine Int64-Spalte
vorher am besten die Spalte komplett löschen
alter table produktion drop datum_kurz
-
Super, hat geklappt. Jetzt kann ich die Monatswerte filtern...
Vielen Dank