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 👍


Anmelden zum Antworten