HIS报表的查询与导出

HIS报表的查询与导出


         笔者已经有近两年没有在HIS(中联)里面查询导出报表了,突然接到任务,微微有点犯难。但是经过一番周折还是顺利完成了任务,特记录如下。 1、 第一步当然是查询一下有没有之前做好的脚本,但是很遗憾仅仅找到表2和表5。表8这种东西第一次见,应该是这两年才出来的新生事物。 2、 第二步那不用说在HIS的报表工具里找下有没有相同或者相似的报表,遗憾的是还是没有。 3、 那么有且仅有自己写这一条路了!(用病人结账处理和病人费用查询两个模块的sql语句截取帮助黑大!) 自己写报表其实挺麻烦的,尤其是这个报表有36个字段,虽然比表2的255个少的多,但是也不是特别轻松的工作。

          先看一下报表结构:初略分成四部分。病人基本信息和住院信息、病案诊断、住院费用组成和病人医疗付款方式。大概思路是分成4个sql来写,然后再关联起来。

          第一部分 病人基本信息和住院信息 这部分最简单,在病人信息表和病案主页信息表里都基本都可以找到。奇怪的是信息表里有着病人详尽的信息资料唯独没有姓名,想来是考虑到对病人的隐私保护。

          第二部分 提取的是病案诊断信息,对排名前四的主要诊断均需要提取。技巧有两个:一是关联ICD-10编码的时候,摆放4个关联表(即ICD-10编码基础数据表),然后分别关联即可。二是病案编目的日期不为空,否则表示尚未编目,一般没有必要提取未编目的数据(虽然未编目是极少数的情况,但是笔者也遇到过,这个会造成病人总数不符。一般是由于病案管理人员取消编目后修改病案,却忘记重新编目归档造成。)。  再有就是注意一下对诊断来源(病历、入院登记、主页整理还是病案,一般取病案诊断)、诊断类型(相对复杂,可能有十几个类型,按需索取即可)和诊断次序有一定了解即可,没有HIS的数据字典和数据结构说明每个参数的意义这几乎就是一个不能完成的任务。 相对来说第二部分仅涉及两个表,提取起来也是相对简单的。稍稍再注意一下左/右关联即可。

        第三部分 住院费用组成这个较为简单。安照系统分类的费用组成group by一下就可以了。这里用case when做的行列转换,意外的是case when竟然可以包含in/not in语句,真是出乎意料的惊喜,省了好多操作。比较奇怪的是其他字段都有,但是竟然没有西药费的字段。

         第四部分 涉及的是病人费用部分。病人费用包括预交金、住院费用、医保报销、个人账户支付、公务员补助、大额统筹支付、生育统筹支付、账号抵用、民政补助、医院收支等等,更不用说什么现金、卡金等等搅在一起。可以说费用部分这个是这次统计报表最复杂的部分,同时理解了病人费用结算的原理,对HIS这个收费才是老本行的软件也理解了大半。 那么为了方便说明把医保统筹和各种补助和HIS自费结算分开解说。即先看病人全自费的情况。 流程如下:全自费病人预交金入院,住了几天产生了住院费,最后办理出院结算。 预交金和住院费的差值即病人需要补缴还是需要退给病人的数额。这个有个概念是“冲预交”,即预交金冲销了部分或全部住院费,多退少补。有了“冲预交”的概念,我们再说一下“反冲销”,即产生一笔和之前结算完全相反的记录,把之前结算的费用全部回收(撤销病人出院),两笔记录一正一反,互相冲抵,帐即是平的。

          一般有几个情况需要做这种操作,最简单的一种情况是病人到住院结帐处刚刚办好出院手续,这个时候医生从楼上冲了下来,“某某,刚刚出的病理报告显示你其他地方还有肿瘤或者病变,再回来住几天吧”。然后病人乖乖办理了撤销出院的手续,重新回到病床继续治疗,举的例子可能不恰当,但是意思应该表达了出来。其他情况包括:医保反结算(医保反结算有多种情况,常见的是生育统筹支付);费用错误(召回调整费用)等等情况。甚至有可能出现结算、冲销结算(即反结算),再结算、再次冲销结算的情况反复多次的情况。

         这个时候数据后台就会很会产生大量的互相冲抵的数据,这个时候应该怎么看数据库里的相关数据表呢?看结帐ID!此时预交和结账的凭证是同一个结帐ID。对这个结帐ID的冲销会产生一个新的结帐ID,新的结帐ID对应的预交凭证和结账凭证和之前的凭证的系统票号相同。两笔一冲抵,相当于病人没有办理出院。类似的多次结算和反结算,都是看两两冲抵的数据。正常情况下,系统里面同时记录有系统票号和实际票号,查询到实际的票号去对应患者手中的票据,解答或者处理相应的问题。

         另外还需要了解一下收费员的处理方法:一是回收结帐凭证,结帐和预交的费用也要做反操作,打印冲销凭证,把预交金凭证交还给病人或者补打一张,注意只能重打原来那张(如果产生新的预交金票号是有问题的,说明病人又缴纳了预交金)!然后病人就可以拿着预交金发票回病床了继续治疗了- - 题外话说完了,重点回到报表的处理。这里用的decode函数做的行列转换,似乎要比case when效率高一点点,但是好像不能包含in/not in语句。但是无所谓了,group by+大量的嵌套同样能解决问题。要点只有一个:就是对各自结算方式加以分类然后相加。这里我发现程序员参数的设计比较精巧。1和11,2和12代表冲销和反冲销。截取一位的情况下,可以把现金结算翻译为单/多次“冲预交”,前台显示相关的数据很清晰。

全部语句:

          select a.住院号,a.年龄,e.出生日期,a.性别,a.入院日期,a.出院日期,a.住院天数,g.名称 入院科室,h.名称 出院科室,'' as "损伤、中毒的外部原因",b.*, d.费用合计,d.治疗费,d.药品费,西药费,d.中药费,d.床位费,d.诊查费,d.检查费,d.手术费,d.化验费,d.护理费,d.其他费用,a.医疗付款方式 参保类型,f.保险统筹基金支付费用,f.个人账户支付,f.患者自付费用,f.医疗救助负担 from 病案主页 A ,部门表 G,部门表 H,病人信息 e, (SELECT C.病人ID, C.主页ID, D.名称 AS 主要诊断名称,D.编码 AS 主要诊断编码, E.名称 AS 主要诊断名称1,E.编码 AS 主要诊断编码1, F.名称 AS 主要诊断名称2,F.编码 AS 主要诊断编码2, G.名称 AS 主要诊断名称3,G.编码 AS 主要诊断编码3 FROM (SELECT A.病人ID, A.主页ID, MAX(DECODE(A.诊断类型, 3, DECODE(A.诊断次序, 1, A.疾病ID))) AS 主要诊断ID, MAX(DECODE(A.诊断类型, 3, DECODE(A.诊断次序, 2, A.疾病ID))) AS 主要诊断ID1, MAX(DECODE(A.诊断类型, 3, DECODE(A.诊断次序, 3, A.疾病ID))) AS 主要诊断ID2, MAX(DECODE(A.诊断类型, 3, DECODE(A.诊断次序, 4, A.疾病ID))) AS 主要诊断ID3 FROM 病人诊断记录 A, 病案主页 B WHERE A.病人ID = B.病人ID AND A.主页ID = B.主页ID AND A.记录来源 = 4 AND B.编目日期 IS NOT NULL AND B.出院日期 GROUP BY A.病人ID, A.主页ID) C, 疾病编码目录 D, 疾病编码目录 E, 疾病编码目录 F, 疾病编码目录 G WHERE D.ID = C.主要诊断ID AND E.ID(+) = C.主要诊断ID1 AND F.ID(+) = C.主要诊断ID2 AND G.ID(+) = C.主要诊断ID3 )b , (Select 病人ID,主页ID,wm_concat(已行手术) as 手术 From 病人手麻记录 where 记录来源=4 and 主页ID=2 group by 病人ID,主页ID) c, ( select m.病人ID,m.主页ID,医保基金+生育统筹支付+大额统筹+公务员补助 保险统筹基金支付费用,个人帐户+帐户抵用 个人账户支付,冲预交+卡金+现金 患者自付费用 ,民政补助 医疗救助负担 from ( select A.病人ID,A.主页ID, SUM(DECODE(结算方式,'冲预交',金额,0)) 冲预交, SUM(DECODE(结算方式,'医院收支',金额,0)) 医院收支, --3 SUM(DECODE(结算方式,'民政补助',金额,0)) 民政补助, --4 SUM(DECODE(结算方式,'现金',金额,0)) 现金, --3 SUM(DECODE(结算方式,'个人帐户',金额,0)) 个人帐户, --2 SUM(DECODE(结算方式,'医保基金',金额,0)) 医保基金, --1 SUM(DECODE(结算方式,'卡金',金额,0)) 卡金, --3 SUM(DECODE(结算方式,'生育统筹支付',金额,0)) 生育统筹支付, --1 SUM(DECODE(结算方式,'大额统筹',金额,0)) 大额统筹, --1 SUM(DECODE(结算方式,'帐户抵用',金额,0)) 帐户抵用, --2 SUM(DECODE(结算方式,'公务员补助',金额,0)) 公务员补助 --1 from ( select c.病人ID,c.主页ID,c.结算方式,c.金额 from ( Select A.病人ID,A.主页ID, Decode(Substr(A.记录性质,Length(A.记录性质),1),1,'冲预交',A.结算方式) as 结算方式,Sum(Nvl(冲预交,0)) as 金额 From 病人预交记录 A ,结算方式 B Where A.结算方式=B.名称(+) --and 病人id=14695 and 主页id=1 Group by A.病人ID,A.主页ID, Decode(Substr(A.记录性质,Length(A.记录性质),1),1,'冲预交',A.结算方式) ) c ) A group by A.病人ID,A.主页ID ) m) f, (select s.病人id,s.主页id , sum(s.金额) as 费用合计, sum( case when s.名称='治疗费' then s.金额 else (0) end ) as 治疗费, sum( case when s.名称='药品费' then s.金额 else (0) end ) as 药品费, sum( case when s.名称 in ('甲类药品费','乙类药品费','非甲乙药品','自费药') then s.金额 else (null) end ) as 西药费, sum( case when s.名称='中药费' then s.金额 else (0) end ) as 中药费, sum( case when s.名称='住院费' then s.金额 else (0) end ) as 床位费, sum( case when s.名称='诊查费' then s.金额 else (0) end ) as 诊查费, sum( case when s.名称='检查费' then s.金额 else (0) end ) as 检查费, sum( case when s.名称='手术费' then s.金额 else (0) end ) as 手术费, sum( case when s.名称='化验费' then s.金额 else (0) end ) as 化验费, sum( case when s.名称='护理费' then s.金额 else (0) end ) as 护理费, sum( case when s.名称 not in ('住院费','诊查费','治疗费','护理费','化验费','检查费','手术费','药品费','中药费') then s.金额 else (0) end ) as 其他费用 from (select a.结帐时间, a.病人id, a.主页id, b.名称, sum(a.结帐金额) as 金额 from 病人结帐汇总 a, 收入项目 b where a.收入项目id = b.id group by a.结帐时间, a.病人id, a.主页id, b.名称) s group by s.病人id, s.主页id) d where a.入院科室id=G.id and a.出院科室id=H.id and a.病人id=f.病人id(+) and a.主页id=f.主页ID(+) and a.病人id=e.病人id(+) and a.病人id=b.病人id(+) and a.主页id=b.主页ID(+) and a.病人id=c.病人id(+) and a.主页id=c.主页ID(+) and a.病人id=d.病人id(+) and a.主页id=d.主页ID(+) and a.登记时间 between to_date('2016-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2016-12-31 23:59:59','yyyy-mm-dd hh24:mi:ss')

你可能感兴趣的:(HIS报表的查询与导出)