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

时间:2015-03-16 16:00:30

标签: sql sql-server-2008-r2

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

一个客户可以有多集,每集都会有0或1个出院记录(取决于客户是否已经出院或仍在占用床位)。

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

我创建了一个SQL小提琴,使其更容易。

SQL Fiddle

如果我在/ 2007年7月运行此查询,那么12个月期间的开始和结束日期是01/01/2006 - 31/12/2006。 2007年8月,12个月期间为2007年2月1日至2007年1月31日,2007年9月为12个月期间为2007年3月1日至2007年2月28日。我应该每个月收到以下数据:

结果:

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

请注意,只要我能获得合格记录的合适EpisodeID,我就不需要上述格式的输出。

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



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
&#13;
&#13;
&#13;

谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您需要列出上一年开始的所有剧集,并为在第一集剧集结束日期之后开始的相同客户端附加任何新剧集。从那以后,很容易在第一集结束和下一集开始之间的几个月内得到差异,并做出相应的反应。

编辑:这是基于新信息的修订查询。

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;

以下是Jul07Aug07Sep07的SQL小提琴。通知第5集现在在所有三个时间段内都显示为“威胁”状态。起初我认为这是一个问题,但是第5集在所有三个时间段开始,并且不会在其中任何一个中释放。所以它有资格作为“治疗中”,但你没有在任何一个例子中显示它。你在什么基础上取消资格呢?