SQL查询两个住院病人日期之间的门诊预约

时间:2017-03-20 15:13:04

标签: sql-server date

目前我的报告是笛卡尔积的一个主要例子,但我似乎无法找到解决方案

我有2张桌子,1张桌子包含467个门诊预约,第2张包含62名住在一夜之间的病人(住院病人)。少数患者有2或3个住院过夜,这些少数患者导致我头痛

我需要生成一份显示所有活动的报告,但当患者作为门诊病人和住院病人接受治疗时,显示2个住院病人日期之间的所有门诊病人预约

我无法弄清楚如何从一个表中读取一行并从第二个表中读取2行并检查 inpat_date_first和inpat_date_second之间的appointment_date

目前的结果是: -

NHS No  IP Start    IP End  OP Appoint  
NHS_No1 21/12/2016  21/12/2016  12/01/2017  1   
NHS_No1 21/12/2016  21/12/2016  16/12/2016  1   
NHS_No1 21/12/2016  21/12/2016  24/11/2016  1   
NHS_No1 21/12/2016  21/12/2016  28/12/2016  1   
NHS_No1 21/12/2016  21/12/2016  06/10/2016  1   
NHS_No1 21/12/2016  21/12/2016  21/07/2016  1   
NHS_No1 21/12/2016  21/12/2016  27/10/2016  1   
NHS_No1 21/12/2016  21/12/2016  08/12/2016  1   
NHS_No1 21/12/2016  21/12/2016  01/12/2016  1   
NHS_No1 21/12/2016  21/12/2016  15/12/2016  1   
NHS_No1 21/12/2016  21/12/2016  21/07/2016  1   
NHS_No1 16/11/2016  16/11/2016  12/01/2017  2   
NHS_No1 16/11/2016  16/11/2016  16/12/2016  2   
NHS_No1 16/11/2016  16/11/2016  24/11/2016  2   
NHS_No1 16/11/2016  16/11/2016  28/12/2016  2                   
NHS_No1 16/11/2016  16/11/2016  06/10/2016  2                   
NHS_No1 16/11/2016  16/11/2016  21/07/2016  2                   
NHS_No1 16/11/2016  16/11/2016  27/10/2016  2                   
NHS_No1 16/11/2016  16/11/2016  08/12/2016  2                   
NHS_No1 16/11/2016  16/11/2016  01/12/2016  2                   
NHS_No1 16/11/2016  16/11/2016  15/12/2016  2                   
NHS_No1 16/11/2016  16/11/2016  21/07/2016  2                   
NHS_No1 31/08/2016  31/08/2016  12/01/2017  3                   
NHS_No1 31/08/2016  31/08/2016  16/12/2016  3                   
NHS_No1 31/08/2016  31/08/2016  24/11/2016  3                   
NHS_No1 31/08/2016  31/08/2016  28/12/2016  3                   
NHS_No1 31/08/2016  31/08/2016  06/10/2016  3                   
NHS_No1 31/08/2016  31/08/2016  06/10/2016  3                   
NHS_No1 31/08/2016  31/08/2016  21/07/2016  3                   
NHS_No1 31/08/2016  31/08/2016  27/10/2016  3                   
NHS_No1 31/08/2016  31/08/2016  27/10/2016  3                   
NHS_No1 31/08/2016  31/08/2016  08/12/2016  3                   
NHS_No1 31/08/2016  31/08/2016  01/12/2016  3                   
NHS_No1 31/08/2016  31/08/2016  15/12/2016  3                   
NHS_No1 31/08/2016  31/08/2016  21/07/2016  3

我需要的地方: -

NHS No  IP Start    IP End  OP Appoint
NHS_No131/08/2016   31/08/2016  21/07/2016
NHS_No1 31/08/2016  31/08/2016  21/07/2016
NHS_No1 31/08/2016  31/08/2016  06/10/2016
NHS_No1 31/08/2016  31/08/2016  06/10/2016
NHS_No1 31/08/2016  31/08/2016  27/10/2016
NHS_No1 31/08/2016  31/08/2016  27/10/2016
NHS_No1 16/11/2016  16/11/2016  24/11/2016
NHS_No1 16/11/2016  16/11/2016  01/12/2016
NHS_No1 16/11/2016  16/11/2016  08/12/2016
NHS_No1 16/11/2016  16/11/2016  15/12/2016
NHS_No1 16/11/2016  16/11/2016  16/12/2016
NHS_No1 21/12/2016  21/12/2016  21/07/2016
NHS_No1 21/12/2016  21/12/2016  28/12/2016
NHS_No1 21/12/2016  21/12/2016  12/01/2017

由于

2 个答案:

答案 0 :(得分:0)

也许我错过了什么,但为什么这不能产生你想要的结果呢?

select ip.*, op.*
from Sandbox.dbo.tbl_Wilts_Glaucoma_ipSpells ip
  inner join Sandbox.dbo.tbl_Wilts_Glaucoma_opAppoints op
    on op.Pseudonym = ip.Pseudonym 
  and op.AppointmentDate >= ip.AdmitDate 
  and op.AppointmentDate <= ip.DischargeDate

要显示两个表中的所有行,但当op匹配连接条件时显示在同一行,请使用full outer join

select ip.*, op.*
from Sandbox.dbo.tbl_Wilts_Glaucoma_ipSpells ip
  full outer join Sandbox.dbo.tbl_Wilts_Glaucoma_opAppoints op
    on op.Pseudonym = ip.Pseudonym 
  and op.AppointmentDate >= ip.AdmitDate 
  and op.AppointmentDate <= ip.DischargeDate

答案 1 :(得分:0)

怀疑它。 感谢那些帮助清除蜘蛛网以寻找解决方案的人