Ich habe jetzt eine Lösung mit Hilfe eines Scriptes und einer temporären Tabelle gefunden, die ganz gut funktioniert. Wenn es jemand noch einfacher hinbekommt, bitte informieren
.
Code: Alles auswählen
declare Tag1 date;
declare Tag2 date;
declare Cursor1 cursor;
declare HPnId integer;
declare HTag date;
try drop table #TmpNw; catch all end;
select Nw.PnId,Nw.Tag,Sum(Nw.Stunden) TagesStunden
into #TmpNw
from Stundennachweis Nw
where year( Nw.Tag )=2016 and month( Nw.Tag )=1
group by Nw.PnId,Nw.Tag
order by Nw.PnId,Nw.Tag
set Tag1 = cast( '2016-01-01' as SQL_DATE );
set Tag2 = Tag1;
set HPnId = 0;
set HTag = Tag1-1;
open Cursor1 as select * from #TmpNw order by PnId,Tag;
while fetch Cursor1 do
if Cursor1.PnId<>HPnId then
// Cursor steht auf ersten Datensatz der nächsten Person.
if HPnId<>0 then
// restliche Datensätze der vorherigen Person bis Monatsende anlegen
while month( Tag2 )=month( Tag1 ) do
insert into #TmpNw values( HPnId,Tag2,0 );
set Tag2 = Tag2+1;
end while;
end if;
// Zur nächsten Person wechseln
set HPnId = Cursor1.PnId;
set HTag = Cursor1.Tag;
set Tag2 = Tag1; // erster Tag, der gegebenenfalls hinzugefügt werden muß
end if;
set HTag = Cursor1.Tag;
// alle Datensätze bis zum vorhandenen Tag hinzufügen
while Tag2 < HTag do
insert into #TmpNw values( HPnId,Tag2,0 );
set Tag2 = Tag2+1;
end while;
set Tag2 = HTag+1;
end while;
close Cursor1;
// Bei der letzten Person noch die Tage bis zum Monatsende hinzufügen
while month( Tag2 )=month( Tag1 ) do
insert into #TmpNw values( HPnId,Tag2,0 );
set Tag2 = Tag2+1;
end while;
select *
from #TmpNw
order by PnId,Tag
Dabei kommt das gewünschte Ergebnis raus:
Code: Alles auswählen
PnId Tag TagStunden
1234 01.01.2016 0,00
1234 02.01.2016 0,00
1234 03.01.2016 0,00
1234 04.01.2016 8,50
1234 05.01.2016 8,00
...
1234 28.01.2016 2,00
1234 29.01.2016 0,00
1234 30.01.2016 0,00
1234 31.01.2016 0,00
Vielleicht kann der eine oder andere ja damit etwas anfangen
.