2014-09-16 1 views
0

예약 할 리소스의 가용성을 예측해야하는 기술을 기반으로 날짜 테이블에서 누락 된 항목을 계산할 수있는 쿼리를 작성하려고합니다. 그것이 할 수 있는지 나는 확실하지 않다. 그리고 나는 논리와 확실히 고투하고있다!다중 테이블 쿼리에서 누락 된 날짜 찾기

테이블

(staffID 2 staffID 1 6 무료 날짜와 2)

날짜

ID  dateFrom  StaffID 
1  01-06-2014   1 
2  02-06-2014   1 
3  03-06-2014   1 
4  04-06-2014   1 
5  05-06-2014   1 
6  01-06-2014   2 
7  03-06-2014   2 
8  04-06-2014   2 
9  05-06-2014   2 
10  06-06-2014   2 

직원

StaffID Name 
    1  John 
    2  Paul 

기술

ID  StaffID SkillID 
1  1  1 
2  1  2 
3  1  3 
4  2  2 
5  2  3 
6  2  4 

저는 6 월에 각 기술에 대해 X 일 동안 예약 할 수있는 쿼리가 없다고 말합니다. 이것은 가능한가? 직원 테이블에 참여하기 위해 존재하지 않는 레코드를 찾고 있습니까?

나는 예약없이 일을 식별 할 수있는 캘린더 테이블을 만들었지 만 솔직히 말해서 거기에서 고심하고 있습니다.

도움을 주시면 대단히 감사하겠습니다.

스티브

는 편집 : DB는 SQL 2005

예상 출력 (가능한 경우)입니다

SkillID Number of days available 

    1    20 
    2    22 
    3    14 

+2

당신이 무엇을 데이터베이스에 추가 작업 및 예상 출력 – Ram

답변

2

모든 가능한 날짜와 일정 테이블 (예약을 만들거나하지)

select count(distinct ad.calendarDate), s.SkillID 
from all_dates ad 
cross join skills s 
where not exists (
    select 1 from 
    dates where dateFrom = ad.calendarDate 
    and StaffID = s.StaffID 
) 
group by s.SkillID 
+0

이 쿼리에 특정 달을 어떻게 선택합니까? 트롤링 할 수있는 많은 양의 데이터가 있습니다. 나는 바깥 쪽 where 절에 날짜를 추가하는 것 같아요? –

+1

@SteveMcCall이 맞으면'where' 절에 다음을 추가 할 수 있습니다 :'and ad.calendarDate between '2014-01-01'and '2014-01-31'' – FuzzyTree

+0

좋아요, 이것은 카운트를 생성하는 것 같습니다 skillID 코드로 그룹화 된 일 수는 있지만 하루를 예약 한 곳에서는 카운트를 줄이지 않는 것으로 보입니다 (30은 모든 스킬의 카운트로 표시됩니다). –

1

나는 당신의 문제를 이해하면 쿼리가 될 것입니다 어떤 일이 같은 : 당신이 날짜 범위를 추가하려면

Select sum(temp.nbrDate), temp.SkillID from 
    (Select s.SkillID, count (d.ID) as nbrDate from Skills s, Dates d 
    where s.StaffID = d.StaffID 
    Group by SkillID) temp 
group by SkillID 

는이를 추가하려면 어디에 가까운 :

and d.DateForm between '01-06-2014' and '30-06-2014'