Select 返回多个相同日期的语句

Select Statement Returning Multiple of Same Dates

我遇到了 select 语句返回多个相同日期的问题。

我将从我拥有的 table 开始:

日历:非常基本,只是一个 table,其中包含接下来 20 年的所有日期。

PKDate
------
2015-04-01
2015-04-02
2015-04-03
etc...

DaysWorked:此 table 包含公司所有设备工作的所有天数。日历中的 PKDate 到此 table 中的 DayWorked 有一个外键约束。

DayWorked  |  Unit
----------------
2015-04-01 | 102
2015-04-05 | 103

事件:这是我们调度系统背后的table。这包含所有可以作为休息日预订的日子。使用可以 select 休假或休假的开始和结束日期。 table.

中没有外键约束
Name     |  EventStart  |  EventEnd  |  Unit  
-----------------------------------------
Days Off | 2015-04-06   | 2015-04-08 | 103
Days Off | 2015-04-03   | 2015-04-09 | 102

这是我正在执行的存储过程:

select distinct PKDate as 'Date', case when PKDate not in (select DayWorked
                                             from DaysWorked
                                             where Unit='124')
                                then 'AVAILABLE'
                                else ''
                                end
                                as 'Available',

                    case when PKDate in (select DayWorked
                                        from DaysWorked
                                        where Unit='124')
                    then 'WORKED'
                    else ''
                    end
                    as 'Worked',

                    case when PKDate between E.EventStart and DATEADD(day, -1, E.EventEnd)
                         and E.ResourceID='124'
                    then UPPER(E.Name)
                    else ''
                    end
                    as 'Schedule'
from Event E
full outer join Calendar C
on PKDate between E.EventStart and E.EventEnd
where PKDate between '2015-04-01' and GETDATE()
order by PKDate asc

此存储过程几乎按计划运行。我希望程序的结果每天在日历中的一栏(日期)中显示,然后显示设备是否可用(可用)、设备是否工作(工作)以及设备是否已预订休假或假期(时间表)。

当我 运行 程序是同一日期的日期显示不止一次时发生了什么。示例如下图所示:

从 4 月 13 日到 4 月 16 日这几天是重复的。我相信这些日子是重复的,因为我在事件 table 中有那些日子的东西,但我不知道为什么这一天显示两次。我怎样才能让这些天只显示一次?

select C.PKDate
  ,case when not exists ( select * from DaysWorked where Unit = '124' and DayWorked = C.PKDate )
    and not exists ( select * from Event E where E.EventStart <= C.PKDate and E.EventEnd >= C.PKDate and E.ResourceID = '124')  
    then 'AVAILABLE' else '' end as Available
  ,case when exists ( select * from DaysWorked where Unit = '124' and DayWorked = C.PKDate ) then 'WORKED' else '' end as Worked
  ,isnull((select max(E.Name) from Event E where E.EventStart <= C.PKDate and E.EventEnd >= C.PKDate and E.ResourceID = '124' ), '') as Schedule
from Calendar C
where C.PKDate between '2015-4-1' and getdate()
order by c.PKDate