Abfrage-Problem Datum

ccdri

Neuer Benutzer
Beiträge
2
Hallo zusammen,

folgende Datenstruktur
Menge --------- Von ------------- Bis
6000 ------- 01.01.2015 ---- 31.01.2015
30000 ----- 01.01.2015 ---- 30.06.2015

Ich benötige nun ein Select, dass mir die monatliche Menge anzeigt.
Das bedeutet:
Januar: 6000 + 30000 / 6
Februar: 30000 / 6

Der Zeitraum beträgt immer einen oder sechs Monate.
Wenn ich nun aber nach dem 'Datum von' gruppiere, dann erhalte ich nur den Januar nicht aber Februar - Juni.
Ich verzweifle an diesem Statement und würde mich über ein paar Tipps freuen.

VG
 
Werbung:
erst mal prüfen, wie lange der zeitraum ist, und dann durch die anzahl der monate teilen. Wo genau ist Dein Problem, was ist Dein bisheriger Ansatz?
 
Also unter MSSQL würde ich per CTE (hier der WITH Teil) ein Raster von Monaten anlegen, darauf die Tabelle mit den Daten joinen und den Rest per GROUP BY etc. ermitteln.
Code:
WITH raster(datum) AS (
SELECT    cast('2015-01-01' AS DATE)
UNION ALL
SELECT    dateadd(m,1,datum)
FROM    raster
WHERE    datum <= getdate()
)
SELECT    datepart(yyyy,datum) AS Jahr,
        datepart(mm,datum) AS Monat,
        sum(t.Menge / datediff(month,von,bis)) AS Menge
FROM    raster r
LEFT JOIN tabelle t
ON        r.datum BETWEEN t.von AND t.bis
GROUP BY datepart(yyyy,datum),datepart(mm,datum)
OPTION (MAXRECURSION 100)
 
Code:
SELECT sum(case when trunc(Von, 'MONTH') <> trunc(Bis, 'MONTH') THEN Menge/6 ELSE Menge),
       trunc(Von, 'mm') as timestamp
  FROM    tabelle
  GROUP BY trunc(Von, 'mm')
Das war mein Ansatz, bis mir auffiel, dass mir dann wie gesagt nur die Mengen des 1. Monats eines Zeitraums berechnet werden und nicht die restlichen.

Das mit dem Raster hört sich gut an, werde ich einmal probieren. Danke
 
Probier mal erstmal ob du mit
Code:
WITH raster(datum) AS (
SELECT    cast('2015-01-01' AS DATE)
UNION ALL
SELECT    dateadd(m,1,datum)
FROM    raster
WHERE    datum <= getdate()
) SELECT * FROM raster
ein entsprechendes Raster bekommst. der Rest ist dann LEFT JOIN und GROUP BY.
 
Code:
SELECT sum(case when trunc(Von, 'MONTH') <> trunc(Bis, 'MONTH') THEN Menge/6 ELSE Menge),
       trunc(Von, 'mm') as timestamp
  FROM    tabelle
  GROUP BY trunc(Von, 'mm')
Das sollte eig. funktionieren... Sicher das dir nicht einfach Februar Daten fehlen?
(Man beachte dass das Gruppierungsdatum das "VON"-Datum ist...)

Das einzige Problem das du hier bekommen wirst, ist der Jahreswechsel... Es wird hier nur der Monat und nicht das Jahr unterschieden...
 
Wenn ich das richtig verstanden habe sollen aus Monat 1 bis 6 auch 6 Zeilen für jeden der Monate im Zeitraum werden.
 
Richtig, und genau das macht er mit seiner Gruppierung...
Code:
 GROUP BY trunc(Von, 'mm')
Dafür muss man wissen das die Trunc-Funktion von einem Datum den Tag, die Stunden, die Minuten und die Sekunden abschneided, mit dem 'MM' Parameter :)

D.h. wir gruppieren auf den ersten jeden Monats
01.01.2016
01.02.2016
etc...
 
Also trunc() vom 01.01.2016 liefert 1 für Januar, trunc() vom 31.06.2016 liefert 6 Juni. Wie kommen dann Februar bis Mai zustande? Dafür gibt es ja keine Ausgangsdatensätze.
 
Werbung:
Zurück
Oben