Zeitraum in Monate aufteilen und Beiträge zählen

T-Arendt

Benutzer
Beiträge
13
Hallo,

Ich bin hier auf ein Problem gestoßen.
Und zwar muss ich Beiträge zählen die zwischen einen Zeitraum liegen und diese einzelnen Monaten zuordnen.

Bsp.:
Von 01.03.2015
Bis 31.07.2015
Status: A oder B

Nun muss ich die Beiträge zählen, die mit A gefüllt sind oder B und diese dann den einzelnen Monaten in diesen Zeitraum zuordnen.
Also
März = x A Datensätze
März = x B Datensätze
April = x A Datensätze
....
Usw

Leider komme ich nicht auf das Script wie ich das lösen kann.
Stelle mich da echt doof an.

Wenn jemand eine Idee hat, wäre ich echt dankbar!

Mfg
Tobinski
 
Werbung:
ohne die Tabelle jetzt echt zu kennen, aber etwa so:

select extract(month from datums_spalte), sum(case when status = 'A' then 1 else 0 end) as status_a, ... from ... group by extract(...)
 
Danke erstmal für den Hinweis aber ich glaube, dass bringt mich nicht wirklich weiter.
Den Monat aus Einen Datum auslesen und dann zählen und gruppieren ist ja nicht das Problem, sondern das zählen und gruppieren innerhalb eines Zeitraums (also datum_von und datum_bis). Da liegt mein eigentliches Problem. Ich schaffe es enfach nicht, den Zeitraum in einzelne Monate zu splitten und das dann zu gruppieren.
 
Also ich glaub ich steh aufn Schlauch!!!

Man muss aber auch dazu sagen, in ms sql kenn ich den Befehl "extract" nicht. Denke es ist wohl ähnlich wie datepart.
 
in ms sql kenn ich den Befehl "extract" nicht.

er 'extrahiert' aus einem Datum den Monat. Dann kannst Du darauf gruppieren. Ganz exakt ist das nicht, wenn Du Zeiträume von länger als einem Jahr hast, dann kommt alles, was in Monat X war, in eine Gruppe. Das ist vermutlich nicht gewollt - dann muß man halt auch das Jahr dazuziehen. Aber nach Deinem Beispiel wäre das so okay.

Ja, ich nutze halt PostgreSQL. Aber das hier ist so trivial, da gibt es ganz sicher auch von M$SQL eine passende Lösung.
 
Ok, dann ist es in mssql "datepart" bzw. "Month" um den Monat auszulesen.

Um jetzt mal dass Script nachvollziehen zu können, versuch ich das mal zu vollenden.

So in etwa?

select
month(datum_von),
month(datum_bis),
sum(case when status = 'A' then 1 else 0 end) as status_a,
sum(case when status = 'B' then 1 else 0 end) as status_b
From
tabelle
group by
month(datum_von),
month(datum_bis)

Kommt mir irgendwie zu einfach vor!
 
Syntaktisch sieht das okay aus. Ob das logisch das ist, was Du willst, weiß ich aber nicht. Da sind nun plötzlich 2 Datumsfelder drin.
 
Waren es die ganze zeit schon. Wie im Post beschreiben
Von 01.03.2015
Bis 31.07.2015

Also ein zeitraum von 01.03.2015 bis 31.07.2015. Und in diesen Zeitraum soll monatsweise der jeweilige Status gezählt werden.
Genau deswegen hatte ich dein Script nicht verstanden. Da fehlte mir was...
 
Du hast 2 Spalten: von und bis. Die gehen über 4 Monate. Zu welchem Monat soll das dann zugeordnet werden? An der Stelle ist Deine Definition schlicht zu grob.
 
Na jedem einzelnen Monat in diesem Zeitraum soll das zugeordnet werden. In meinen Beispiel also März, April, Mai, Juni und Juli. Wäre der Zeitraum 01.08. Bis 31.10.2015 eben August, September und Oktober.
Deswegen ja meine frage, wie kann ich den Zeitraum in einzelne Monat innerhalb eines zeitraums aufsplitten?!?!
 
mir fällt da case when ... ein, sowie als Hilfsmittel generate_series(), um eine Liste aller potentiellen Monate zu erzeugen. Nur kommen wir da in Bereiche, wo wohl M$SQL anfängt zu schwächeln ...
 
Generate_series () gibt's so nicht in mssql, man kann es sich aber wohl "nachbasteln".
Aber der Hinweis zu dieser Funktion war trotzdem sehr hilfreich. Dass könnte das googlen nach einer adäquaten Lösung vereinfachen!
 
Ich glaube du suchst einfach nur eine WHERE-Einschränkung:
Code:
SELECT   month(datum_von),
     sum(case when status = 'A' then 1 else 0 end) as status_a,
     sum(case when status = 'B' then 1 else 0 end) as status_b
FROM   tabelle
WHERE   datum_von BETWEEN '2015-03-01' AND '2015-07-31'
GROUP BY month(datum_von)
Wenn du aber sagst du suchst nur Einträge eines Zeitraums, die Einträge bilden aber selbst einen Zeitraum ab, dann musst du klar spezifizieren 1) zählen nur Einträge die in deinem Suchzeitraum begannen, endeten, oder sowohl als auch? Und 2) Wird nur nach datum_von gruppiert oder auch nach datum_bis?
 
Werbung:
Hier mal wie es mit Oracle ginge... Hat aber auch eine Art "generate_series" .... (Würde aber mit jeder Tabelle funktioniere, die nur eine Spalte hat...)
Wahrscheinlich auch noch viel Optimierungsbedarf, es ist früh und ich trink gerade meinen ersten Kaffee... :)
Code:
With dat As
(
   Select to_date('01.01.2015', 'DD.MM.YYYY') as accounting_date, 'A' as ident From dual Union All
   Select to_date('01.02.2015', 'DD.MM.YYYY'), 'A' From dual Union All
   Select to_date('02.02.2015', 'DD.MM.YYYY'), 'A' From dual Union All
   Select to_date('03.02.2015', 'DD.MM.YYYY'), 'A' From dual Union All
   Select to_date('01.03.2015', 'DD.MM.YYYY'), 'A' From dual Union All
   Select to_date('01.04.2015', 'DD.MM.YYYY'), 'A' From dual Union All
   Select to_date('01.05.2015', 'DD.MM.YYYY'), 'A' From dual Union All
   Select to_date('05.05.2015', 'DD.MM.YYYY'), 'A' From dual Union All
   Select to_date('28.05.2015', 'DD.MM.YYYY'), 'A' From dual Union All
   Select to_date('01.06.2015', 'DD.MM.YYYY'), 'A' From dual Union All
   Select to_date('30.07.2015', 'DD.MM.YYYY'), 'A' From dual
), con As
(
   Select to_date('&Min_Date', 'DD.MM.YYYY') as min_date, to_date('&Max_Date', 'DD.MM.YYYY') as max_date From dual
)

Select t.mon, dat.ident, count(*) as countt
From   dat
Full   Join (Select to_char(add_months(trunc(con.min_date), Level - 1), 'Mon') As mon
                   ,con.min_date
                   ,con.max_date
             From   con
             Connect By Level <= (extract(Month From con.max_date) - extract(Month From con.min_date) + 1)) t
On     t.mon = to_char(dat.accounting_date, 'Mon')

Where  dat.accounting_date Between t.min_date And t.max_date

Group  By t.mon, dat.ident
Order  By t.mon asc, dat.ident asc
 
Zurück
Oben