注册 登录
编程论坛 SQL Server论坛

一个疑难应用问题及延伸,请教大神

ggfkk2016 发布于 2016-08-22 00:21, 2204 次点击
我有一个这样的住院情况表(见下表字段),现在两个问题,第一个问题:我想筛选出科室名称、床号、入院时间三者都相同的病人住院记录,并把床位相同的记录放在一起,看同一时间内床位重叠的情况如何,有没有一张床两个人同时用的问题。请问应该如何实现,语句怎么写?第二个问题是在第一个问题基础上的复杂化,就是筛选科室名称、床号都相同,并且住院时间(出院时间-入院时间)期间有重叠的的病人住院记录,看有没有一张床两个人同时用的问题,不仅仅是入院时间相同,这个稍微有点难,请问如何实现,语句怎么写?第一个问题急需解决,第二个慢慢来也可以,感谢大神!!

想实现的效果:把同一入院时间或住院期间重叠的相同床位号记录放在一起,这样谁出现共用一张床现象就一目了然
科室名称       床号     住院号           姓名         性别    年龄    身份证号    住院医生    入院时间    出院时间    结账时间
骨伤科一病区  1楼17床    13004071       张晋          男    39岁    未带             王五          2013-06-09    2013-06-11    2014-02-28
骨伤科一病区  1楼17床    13004222       王宝          男    61岁    12356            李四         2013-06-09    2013-12-31    2014-01-03
骨伤科二病区   2楼11床    13003189      王狼生          男    55岁    411081           赵六         2013-05-06        2013-06-03    2014-01-10
骨伤科二病区   2楼11床    13003315      施生子          女    56岁    -                李四          2013-05-06    2013-05-11    2014-02-28

模拟数据:

住院情况表:

科室名称    床号        住院号          姓名     性别    年龄    身份证号         住院医生    入院时间    出院时间    结账时间
骨伤科             2+28       10001726          崔永远    女    50岁    NULL                    张三    2010-04-07    2014-02-18    2014-02-18
骨伤科一病区    1楼17床       13004071           张晋    男    39岁    未带                  王五    2013-06-09    2013-06-11    2014-02-28
康复科            15楼14床   13000132         汪清年    男    48岁    000000000000000000    赵六    2013-01-06    2013-12-26    2014-01-20
骨伤科一病区    1楼23床       13002332         吴良心    男    31岁    /                     李四    2013-04-02    2013-04-05    2014-02-26
康复科            15楼14     13002848         邓浩强    男    7月    -                    张三    2013-01-06    2013-04-28    2014-12-17
妇产科              27       13003138         符香史    女    40岁    46010019701213494X    王五    2013-05-04    2013-05-12    2014-01-09
骨伤科二病区    2楼11床       13003189         王狼生    男    55岁    411081196911026859    赵六    2013-05-06    2013-06-03    2014-01-10
骨伤科二病区    2楼11床       13003315         施生子    女    56岁    -                     李四    2013-05-06    2013-05-11    2014-02-28
妇产科             6楼28       13003390         赵桑    女    30岁    430403198302202029    张三    2013-05-13    2013-05-22    2014-01-09
妇产科             23       13003495         蔡明黎    女    25岁    46003319880707486X    王五    2013-05-18    2014-03-11    2014-03-11
外科             24       13003505         蔡芬    男    45岁    460001196910200834    赵六    2013-05-18    2013-05-28    2014-10-30
骨伤科一病区    1楼17床       13004222         王宝    男    61岁                            李四    2013-06-09    2013-12-31    2014-01-03
骨伤科二病区    2楼33床       13004289         大鹏    男    43岁    452131197009115567    张三    2013-06-17    2013-11-09    2014-04-14
儿科             18床       13005348        冯鹏圆    男    1岁5月    -                    王五    2013-07-29    2013-08-04    2014-05-19
骨伤科一病区    2楼33床       13004475         宋可    男    22岁                               赵六    2013-06-25    2013-06-30    2014-07-24
骨伤科三病区    3楼22床       13005567        李德生    男    40岁    460200197303025145    李四    2013-08-05    2013-08-12    2014-03-19
骨伤科三病区    3楼25床       13005799        郑向前    女    32岁    460200198108145876    郭良    2013-08-14    2013-08-19    2014-03-19






9 回复
#2
hu9jj2016-08-22 08:08
按床号进行筛选、按入院时间排序,根据出院时间不就可以判定床号是否重叠了。
#3
ggfkk20162016-08-22 08:23
回复 2楼 hu9jj
床号很多,有加床的,几万条记录,一张床不同时间有不同的人用,一个一个筛选效率太差,工作时间不允许
#4
mywisdom882016-08-22 09:22
create table #住院(科室名称 varchar(20),床号 varchar(20),住院号 varchar(10),入院时间 datetime)

insert into #住院
select '骨伤科一病区','1楼17床','13004071','2013-06-09' union all
select '骨伤科一病区','1楼17床','13004222','2013-06-09' union all
select '骨伤科二病区','2楼11床','13003189','2013-05-06' union all
select '骨伤科二病区','2楼11床','13003315','2013-05-06' union all
select '骨伤科一病区','1楼17床','13004076','2013-06-10' union all
select '骨伤科一病区','1楼17床','13004086','2013-06-11'


select a.* from #住院 a,(select 科室名称,床号,入院时间 from #住院 group by 科室名称,床号,入院时间) b
where a.科室名称=b.科室名称 and a.床号=b.床号 and a.入院时间=b.入院时间
只有本站会员才能查看附件,请 登录

用上面的方法,应该可以到达你要求,其他的字段,你自己添加上去。
#5
mywisdom882016-08-22 09:24
上面的结果,和输入的时候,好像是相同的,但实际的时候,是不同的,因为实际的时候,不是连续输入的,中间有很多其他数据的。
#6
mywisdom882016-08-22 10:40

--还可以统计次数
select a.*,b.次数 from #住院 a,(select count(*) as 次数,科室名称,床号,入院时间 from #住院 group by 科室名称,床号,入院时间) b
where a.科室名称=b.科室名称 and a.床号=b.床号 and a.入院时间=b.入院时间
#7
ggfkk20162016-08-22 19:54
回复 4楼 mywisdom88
不行,试过了,这个语句无法实现剔除不相同的记录,无法筛选出病床重叠或相同的信息,不过还是要谢谢你
#8
mywisdom882016-08-23 08:38
回复 7楼 ggfkk2016
那换个角度,是不是可以判断:“科室名称,床号,入院时间”相同时,如果记录有2条以上,就表示,这个床号,今天安排了2个人以上,但不代表是重复的,如果出院了,再安排进来的,就不算重复?那是不是“有2个人以上,且都没出院的”就是重复?

#9
mywisdom882016-08-23 09:37
有2种情况,主要在“日期”字段上面,如果“日期”用字符 varchar(10),则 出院日期='',就表示没出院;如果“日期”用 datetime,则 出院日期=null,表示没出院
drop table #住院
create table #住院(科室名称 varchar(20),床号 varchar(20),住院号 varchar(10),入院时间 varchar(10),出院时间 varchar(10))

insert into #住院
select '骨伤科一病区','1楼17床','01001701','2013-06-09','' union all
select '骨伤科二病区','2楼11床','02001101','2013-05-06','' union all
select '骨伤科一病区','1楼17床','01001702','2013-06-09','' union all
select '骨伤科三病区','3楼18床','03001801','2013-05-06','' union all
select '骨伤科二病区','2楼11床','02001102','2013-05-06','2013-05-06' union all
select '骨伤科一病区','1楼17床','01001703','2013-06-10','' union all
select '骨伤科一病区','1楼17床','01001704','2013-06-11',''

--所有记录,(没解决问题的)
select a.*,b.次数 from #住院 a,(select count(*) as 次数,科室名称,床号,入院时间 from #住院 group by 科室名称,床号,入院时间) b
where a.科室名称=b.科室名称 and a.床号=b.床号 and a.入院时间=b.入院时间
order by a.科室名称,a.床号,a.入院时间

--今天,只显示有重复使用的,日期用字符
select a.*,b.次数,b.重床 from #住院 a,(select count(*) as 次数,sum(case when 出院时间='' then 1 else 0 end) as 重床,
科室名称,床号,入院时间 from #住院 group by 科室名称,床号,入院时间) b
where a.科室名称=b.科室名称 and a.床号=b.床号 and a.入院时间=b.入院时间 and a.出院时间='' and b.重床 > 1
order by a.科室名称,a.床号,a.入院时间
只有本站会员才能查看附件,请 登录
#10
mywisdom882016-08-23 09:55
如果,日期用的是 datetime时,数据要这样
drop table #住院
create table #住院(科室名称 varchar(20),床号 varchar(20),住院号 varchar(10),入院时间 datetime,出院时间 datetime)

insert into #住院
select '骨伤科一病区','1楼17床','01001701','2013-06-09',null union all
select '骨伤科二病区','2楼11床','02001101','2013-05-06',null union all
select '骨伤科一病区','1楼17床','01001702','2013-06-09',null union all
select '骨伤科三病区','3楼18床','03001801','2013-05-06',null union all
select '骨伤科二病区','2楼11床','02001102','2013-05-06','2013-05-06' union all
select '骨伤科一病区','1楼17床','01001703','2013-06-10',null union all
select '骨伤科一病区','1楼17床','01001704','2013-06-11',null

判断时,
sum(case when 出院时间 is null then 1 else 0 end) as 重床

where a.科室名称=b.科室名称 and a.床号=b.床号 and a.入院时间=b.入院时间 and a.出院时间 is null and b.重床 > 1
1