从多表查询中查找缺少的日期

时间:2014-09-16 14:25:07

标签: sql sql-server-2005

我正在寻找一个查询,该查询可以根据资源预测资源可用性的技能来计算日期表中的缺失条目。我不确定它是否可以完成,而且我肯定会在逻辑上挣扎!!

日期

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

(职员ID 1的第6天免费日期和职员ID 2的第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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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'