Forums Neueste Beiträge
 

Komplexe Abfrage

26/02/2009 - 11:26 von Alexander Szigetvary | Report spam
Hi NG!

Ich möchte eine komplexe (zumindestens in meinen Augen) Abfrage generieren.

Ich habe eine Tabelle mit Urlaubsantràgen, die neben dem Namen ein "von" und
ein "bis" Feld und auch die Anzahl der Urlaubstage des jeweiligen Antrags
enthàlt. Ich habe eine weitere Tabelle, die Feiertage und Firmenfenstertage
enthàlt.
Was ich gerne hàtte wàre eine Abfrage (oder stored procedure) die zB für
2009 folgendes enthàlt.

Name Jànner Februar . November Dezember

Die Monatsspalten sollen jeweils die geplanten Urlaubstage enthalten. Für
mich problematisch ist, wie ich, wenn ein Antrag über den
Monats-/Jahreswechsel geht, die Anzahl der Tage, die im einen bzw. in
anderen Monat anfallen, unter Berücksichtigung von Wochenende und
Feiertagstabelle berücksichtigen kann.
Ich müsste im Fall des Monatswechsel die Kalendertage vom "von"-Datum bis
Monatsende ermitteln und davon die Wochenenden bzw. Feiertage abziehen.

Kann mir da jemand bitte einen Tipp geben.

Danke
Alex
 

Lesen sie die antworten

#1 Christoph Ingenhaag
26/02/2009 - 14:45 | Warnen spam
"Alexander Szigetvary" wrote:

Hi NG!

Ich möchte eine komplexe (zumindestens in meinen Augen) Abfrage generieren.

Ich habe eine Tabelle mit Urlaubsantràgen, die neben dem Namen ein "von" und
ein "bis" Feld und auch die Anzahl der Urlaubstage des jeweiligen Antrags
enthàlt. Ich habe eine weitere Tabelle, die Feiertage und Firmenfenstertage
enthàlt.
Was ich gerne hàtte wàre eine Abfrage (oder stored procedure) die zB für
2009 folgendes enthàlt.

Name Jànner Februar . November Dezember

Die Monatsspalten sollen jeweils die geplanten Urlaubstage enthalten. Für
mich problematisch ist, wie ich, wenn ein Antrag über den
Monats-/Jahreswechsel geht, die Anzahl der Tage, die im einen bzw. in
anderen Monat anfallen, unter Berücksichtigung von Wochenende und
Feiertagstabelle berücksichtigen kann.
Ich müsste im Fall des Monatswechsel die Kalendertage vom "von"-Datum bis
Monatsende ermitteln und davon die Wochenenden bzw. Feiertage abziehen.

Kann mir da jemand bitte einen Tipp geben.

Danke
Alex



Hallo Alexander,

schau mal hier (ab SQL Server 2005):

use tempdb
set dateformat ymd;

create table dbo.Feiertage
(
Feiertag datetime not NULL primary key clustered
);

insert into dbo.Feiertage
select '2009-12-24' union all
select '2009-12-25' union all
select '2009-12-26' union all
select '2010-01-01';

create table dbo.Urlaub
(
PersonID int not NULL primary key
,Von datetime
,Bis datetime
);

insert into dbo.Urlaub
select 1, '2009-12-20', '2010-01-10' union all
select 2, '2009-12-24', '2009-12-31';

with Kal as
(
select
cast('2009-01-01' as datetime) Datum
,DATEPART(yy,'2009-01-01') Jahr
,DATENAME(mm,'2009-01-01') Monat
,DATENAME(dw,'2009-01-01') Tag
,1 Arbeitstag
union all

select
Datum + 1 Datum
,DATEPART(yy, Datum + 1) Jahr
,DATENAME(mm, Datum + 1) Monat
,DATENAME(dw, Datum + 1) Tag
,0 Arbeitstag
from Kal
where
Datum < '2010-12-31'
)
,Feier as
(
select
K.Datum
,K.Jahr
,K.Monat
,K.Tag
,F.Feiertag
,case
when K.Tag in ('Samstag', 'Sonntag') then Arbeitstag & 0
else
case
when F.Feiertag is not NULL then Arbeitstag & 0
else 1
end
end Arbeitstag
from Kal K
left join dbo.Feiertage F
on
K.Datum = F.Feiertag
)
select
PersonID
,Jahr
,Monat
,SUM(Arbeitstag) Urlaub
from Feier F
cross join Urlaub U
where
F.Datum between U.Von and U.Bis
group by
PersonID
,Jahr
,Monat
order by
1,2,3
option (maxrecursion 0);


drop table dbo.Feiertage
drop table dbo.Urlaub

Für deine endgültig gewünschte Form müsstes du dann noch mit PIVOT arbeiten
(Onlinehilfe). Dazu hatte ich keine Lust mehr...

VG
Christoph

Ähnliche fragen