暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

病案与SQL|重复入院统计

JefferyNotes 2021-11-03
5298

日常统计中,大家比较困惑的是重复入院如何查找,浙江省内多数医院使用浙江联众病案管理系统。该管理系统默认的病案号编排方式是 [一人一号]制,意思是1个人具有终生的1个号;另一种编号方式是[一次一号]制,意思是每次入院产生新的住院号,不论是否为同一人。两种方法在病案管理过程中各有利弊。下面给大家提供如何查询再入院(重复入院)的病案明细。这里以浙江联众病案管理系统为例。

  1. 如果你采用的是 [一人一号]制  ,那么应该很容易采用3.查询分析-病案综合查询的方法进行查询,检索式如下:

当然其中 距离上次出院天数(同病种)的输入值可以输入任何数值,比如7、15或31。而且,在列名处还可以发现距离上次出院天数距离上次出院天数(不同病种)的字段选项,大家可以逐一尝试。
查出的结果如下图所示:

上述结果说明只查出了第2次(重复次)重复入院的记录,而且主要诊断与前次住院相同。

    2.   如果你采用的是 一次一号制,那么就没有办法应用综合查询进行检索(反正我是没找到办法,若有高手请私信指教)。但是我们可以采用SQL语句查询,首先你要找到软件的SQL语句查询窗口,并把下方的SQL语句粘贴到窗口中。

 在此,笔者提供2种输出格式的查询:
(1)列出所有住院2次及以上的患者信息条目;
   在上面自定义sql语句查询编辑框中粘贴以下SQL代码,下面这些就是传说中的sql语句:

  select
a.brxm as 姓名
, a.bah as 住院号
, a.zycs as 住院次数
, c.ksmc as 住院科室
, CONVERT(VARCHAR(121), a.ryrq, 111) as 入院日期
, CONVERT(VARCHAR(121), a.cyrq, 111) as 出院日期
, a.zyts as 住院天数
, a.zfy as 总费用
, d.ICD10 as 主诊编码
, d.jbmc as 主诊名称
, a.zryjh as 再入院计划
, a.zrymd as 再入院目的
from
ba_brjbxx a
, BATJ_KSDM c
, BA_ICDDM d
, (
select
(a.brxm+CONVERT(VARCHAR(121), a.csrq, 111)) as xmcsrq
, count(a.bah) as sl
from
ba_brjbxx a
where
a.cyrq >='2019.1.1'
and a.cyrq<='2019.1.30'
group by
(a.brxm+CONVERT(VARCHAR(121), a.csrq, 111))
)
b
where
(
a.brxm+CONVERT(VARCHAR(121), a.csrq, 111)
)
=b.xmcsrq
and a.jbxh =d.jbxh
and a.CYKSDM =c.KSDM
and c.zfpb =0
and a.cyrq >='2019.1.1'
and a.cyrq <='2019.1.30'
and b.sl >1
order by
a.brxm
, a.ryrq asc


   以上语句查询的条件是:

  1. 出院日期:2019.1.1至2019.1.30

  2. 患者唯一身份识别:姓名+出生日期(如:张三1991/01/05)

  3. 患者唯一身份识别出现的次数>1

因此,若不出所料,查询结果会列出所有重复住院的患者。之后,小伙伴们可以下载下来愉快的进行二次分析了。

(2)每两条重复住院的记录进行对比;

对于(1)中的结果,有些小伙伴不太懂Excel函数,难以后续分析。此处,笔者提供了另外的导出格式,以下方法只能参考,仍需要下载下来处理(只需要用Excel简单的去重就可以了)。由于笔者所用联众系统的数据库为SQL Server 2000,因此很多函数比如Rank()函数不能用,无法获得较好的结果。大家可以试试下面的语句:

select
a.brxm as 姓名
, b.bah as 前次住院号
, b.ksmc as 前次住院科室
, CONVERT(VARCHAR(121), b.ryrq, 111) as 前次入院日期
, CONVERT(VARCHAR(121), b.cyrq, 111) as 前次出院日期
, b.zyts as 前次住院天数
, b.zfy as 前次住院总费用
, d.ICD10 as 前次主诊编码
, d.jbmc as 前次主诊名称
, b.zryjh as 前次再入院计划
, b.zrymd as 前次再入院目的
, a.bah as 再次住院号
, c.ksmc as 再次入院科室
, CONVERT(VARCHAR(121), a.ryrq, 111) as 再次入院日期
, CONVERT(VARCHAR(121), a.cyrq, 111) as 再次出院日期
, a.zyts as 再次住院天数
, a.zfy as 再次总费用
, b.ICD10 as 再次主诊编码
, b.jbmc as 再次主诊名称
, datediff(day, b.cyrq,a.ryrq) as 距离上次出院天数
, case
when datediff(day, b.cyrq,a.ryrq) between 0 and 7
then '7天内再入院'
when datediff(day, b.cyrq,a.ryrq) between 8 and 14
then '2周内再入院'
when datediff(day, b.cyrq,a.ryrq) between 15 and 31
then '31天内再入院'
End 类型
from
ba_brjbxx a
, BATJ_KSDM c
, BA_ICDDM d
, (
select
a.bah
, a.brxm
, a.csrq
, a.ryrq
, a.cyrq
, a.zfy
, a.zyts
, a.zryjh
, a.zrymd
, b.ksmc
, c.ICD10
, c.jbmc
from
ba_brjbxx a
, batj_ksdm b
, BA_ICDDM c
where
cyrq >='2019.1.1'
and csrq <='2019.1.30'
and a.CYKSDM =b.KSDM
and b.zfpb =0
and a.jbxh =c.jbxh
)
b
where
a.brxm =b.brxm
and a.jbxh =d.jbxh
and a.CYKSDM =c.KSDM
and a.bah <> b.bah
and datediff(day, b.cyrq,a.ryrq)between 0 and 31 --此条件为所有再入院
and a.csrq =b.csrq
and a.cyrq>='2019.1.1'
and a.cyrq<='2019.1.30'
and c.zfpb =0
order by
a.brxm
, b.ryrq asc
, a.ryrq


上面的方法有个小bug,就是会把第n次住院和后面所有住院进行比较,后续经过查询可以插入临时表解决,考虑到小伙伴们对sql语句尚不精通,暂不考虑该方法;这个bug说明数据库太过于老旧。无法过滤为相邻的2次重复住院间比较。因此,大家需要下载下来对“前次住院号”进行重复性删除。


注事项意

(1)大家使用时,不要忘记修改代码中的时间段!!!!

(2)上述语句适合的数据库为SQL Server类型,若为Oracle数据库,需要把CONVERT(VARCHAR(121), A.CYRQ, 111)替换为To_date(A.CYRQ, 'yyyy-mm-dd')。

其它问题,请公众号内留言。

最后,给大家留下一个有趣的问题:

如果是一次一号制,但是却用软件的检索条件查询(一人一号制条件)方法,而且得到了结果,请问,如何解释结果?

动动小手点击关注,有任何病案统计相关需求,可公众号内私信


文章转载自JefferyNotes,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论