WITH tabelle(pauftrag,start,ende,menge) AS (
SELECT 200,cast('2018-06-12' AS DATE),cast('2018-06-15' AS DATE),400 UNION ALL
SELECT 201,'2018-06-13','2018-06-20',333 UNION ALL
SELECT 202,'2018-06-14','2018-06-27',1500 UNION ALL
SELECT 203,'2018-07-05','2018-07-06',100
), t1(pauftrag,start,ende,menge) AS (
SELECT tabelle.pauftrag,
tabelle.start,
tabelle.ende,
tabelle.menge
FROM tabelle
UNION ALL
SELECT t1.pauftrag,
dateadd(day,1,t1.start),
t1.ende,
t1.menge
FROM t1
WHERE dateadd(day,1,t1.start) <= t1.ende
), t2(pauftrag,start,kw,menge) AS (
SELECT t1.pauftrag,
convert(DATE,dateadd(week,0,dateadd(day,1-datepart(dw,t1.start),datediff(day,0,t1.start)))),
datepart(week,t1.start),
( CASE
WHEN t1.menge / sum(count(*)) OVER (PARTITION BY t1.pauftrag) * sum(count(*)) OVER (PARTITION BY t1.pauftrag) = t1.menge
OR datepart(week,t1.start) < max(datepart(week,t1.start)) OVER (PARTITION BY t1.pauftrag)
THEN /*Das hier ist die eigentliche Berechnung der anteiligen Menge*/ t1.menge / sum(count(*)) OVER (PARTITION BY t1.pauftrag) * count(*)
ELSE /*Hier wird auf die letzte KW mit anteiliger Menge der Restbetrag aufgeschlagen*/ t1.menge / sum(count(*)) OVER (PARTITION BY t1.pauftrag) * count(*) +
t1.menge - t1.menge / sum(count(*)) OVER (PARTITION BY t1.pauftrag) * sum(count(*)) OVER (PARTITION BY t1.pauftrag)
END )
FROM t1
WHERE datepart(dw,t1.start) BETWEEN 1 AND 5
GROUP BY t1.pauftrag,dateadd(week,0,dateadd(day,1-datepart(dw,t1.start),datediff(day,0,t1.start))),datepart(week,t1.start),t1.menge
)
SELECT t2.pauftrag,
--Das ist der gesammte Zeitraum, wird einfach durch einen Join der originären Tabelle wieder als Spalten dazu geholt
t3.start,
t3.ende,
--Das ist nur der Zeitraum auf den der berechnete Anteil entfällt
( CASE
WHEN datepart(week,t3.start) = t2.kw
THEN t3.start
ELSE t2.start
END ) AS start_teilzeitraum,
( CASE
WHEN datepart(week,t3.ende) = t2.kw
THEN (CASE WHEN datepart(dw,t3.ende) > 5 THEN dateadd(day,(datepart(dw,t3.ende)*-1+5),t3.ende) ELSE t3.ende END)
ELSE dateadd(day,5,t2.start)
END ) AS ende_teilzeitraum,
t2.kw,
t2.menge
FROM t2
INNER JOIN tabelle t3
ON t2.pauftrag = t3.pauftrag