困难的 SQL 报表查询和子查询

Difficult SQL Query and Subquery For Report

我有床位管理模块,客户来访时我们会为客户分配一张床位。当我们为客户分配床位时,系统通过在剧集 table 中添加条目来开始新的剧集,系统还会在剧集 table 中添加访问的开始日期。当客户离开时,系统会在 Discharge table 中添加一条新记录,并且还会添加结束日期(客户离开的日期)。客户可能会回来,在这种情况下,系统会在剧集 table 中开始第二集,依此类推......

一个客户可以有多个发作,每个发作会有 0 或 1 个出院记录(取决于客户是出院还是仍在床上)。

我需要编写一个查询来接收所有 episodes/clients 在指定的 12 个月内存在的(即客户占用一张床),第二个要求是满足第一个要求的所有数据查询的要求,我需要得到所有那些 clients/episodes 在结束日期后 6 个月内重新占用床位的人。

我创建了一个 SQL fiddle 以使其更容易。

SQL Fiddle

如果我 运行 此查询 in/for 2007 年 7 月,则 12 个月期间的开始和结束日期为 01/01/2006 - 31/12/2006。对于 2007 年 8 月,12 个月的时间段是 01/02/2007 - 31/01/2007,对于 2007 年 9 月,12 个月的时间段是 01/03/2007 - 28/02/2007。我每个月应该收到以下数据:

结果:

EpisodesOccupyingBed    Didnt Re-Occupied   Re-Occupied
EpisodeID1                                  X
EpisodeID2              X   
EpisodeID3      
Total Jul 07   3        1                      1

EpisodesOccupyingBed    Didnt Re-Occupied   Re-Occupied
EpisodeID4      
EpisodeID2              X   
EpisodeID3      
Total Aug 07  3         1                      0

EpisodesOccupyingBed    Didnt Re-Occupied   Re-Occupied
EpisodeID4      
EpisodeID2              X   
EpisodeID3      
Total Aug 07  3         1                      0

请注意,我不需要以上格式的输出,只要我能收到符合条件的记录的 suitable EpisodeIDs。

我正在使用以下查询,但我不知道如何提取记录以重新占用床位记录:

Declare @StartDate DateTime
Declare @EndDate DateTime
Declare @Month varchar(5)
set @Month = 'Jul07' -- set @Month='Aug07' -- set @Month = 'Sep07'
if(@Month = 'Jul07') begin -- report run on July 2007
  set @StartDate = 'January, 01 2006' set @EndDate = 'December, 31 2006'
  end
else if(@Month = 'Aug07')  begin -- report run on July 2007
  set @StartDate = 'February, 01 2006' set @EndDate = 'January, 31 2007'
  end
else if(@Month = 'Sep07') begin
  set @StartDate = 'March, 01 2006' set @EndDate = 'February, 28 2007'
  end
select * from ClientTable as CT inner join EpisodeTable as ET on 
CT.ClientIDCSV = ET.ClientIDCSV
left outer join DischargeTable as DT on 
ET.EpisodeIDCSV=DT.EpisodeIDCSV where
ET.StartDate >= @StartDate and ET.StartDate <= @EndDate

谢谢你的帮助。

您需要列出前一年开始的所有剧集,并附上在第一集结束日期之后开始的相同客户的所有新剧集。由此很容易得出第一集结束和下一集开始之间的月份差异,并做出相应的反应。

编辑:这是根据新信息修改后的查询。

select  e.EpisodeIDCSV,
        case when DateDiff( month,  d.EndDate, e1.StartDate ) > 6 then 'X' end as NoReoccupy,
        case when DateDiff( month,  d.EndDate, e1.StartDate ) <= 6 then 'X' end as Reoccupy
from    Clients c
join    Episodes e
    on  e.ClientIDCSV = c.ClientIDCSV
left join Discharges d
    on  d.EpisodeIDCSV = e.EpisodeIDCSV
join Episodes e1
    on  e1.ClientIDCSV = c.ClientIDCSV
    and e1.StartDate > e.StartDate
left join Discharges d1
    on  d1.EpisodeIDCSV = e1.EpisodeIDCSV
where   e.StartDate >= @StartDate
    and e.StartDate < @EndDate
order by c.EpisodeIDCSV, e.StartDate;

这是 Jul07, Aug07 and Sep07 的 SQL 个小提琴。请注意,第 5 集现在在所有三个时间段中都显示为 "intreat" 条件。起初我以为这是一个问题,但是第 5 集在所有三个时间段内开始并且没有在任何一个时间段内排出。因此它符合 "in treatment" 但您没有在任何示例中显示它。你凭什么取消资格?