Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Zeitraum in Monate aufteilen und Beiträge zählen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von T-Arendt, 20 Juli 2015.

  1. T-Arendt

    T-Arendt Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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(...)
     
  3. T-Arendt

    T-Arendt Benutzer

    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.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    lies noch einmal. und noch einmal.
     
  5. T-Arendt

    T-Arendt Benutzer

    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.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  7. T-Arendt

    T-Arendt Benutzer

    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!
     
  8. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  9. T-Arendt

    T-Arendt Benutzer

    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...
     
  10. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  11. T-Arendt

    T-Arendt Benutzer

    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?!?!
     
  12. akretschmer

    akretschmer Datenbank-Guru

    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 ...
     
  13. T-Arendt

    T-Arendt Benutzer

    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!
     
    akretschmer gefällt das.
  14. ukulele

    ukulele Datenbank-Guru

    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?
     
  15. Distrilec

    Distrilec Datenbank-Guru

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden