某天,接到收费室的通知,需要统计历年来出院未结账的欠费病人情况。接到通知,第一个想到的就是欠费登记程序,启动程序一看,发现信息不全,欠费信息不是系统自动提取而是人工登记的。最后,只能自己使用SQL语句提取了。
首先,确定需要的信息,如:患者ID号,住院次数,患者姓名,住院科室,出入院时间,费别,总费用,预交金结余金额等等。根据这几个字段,我们确定需要用到以下这几张表:住院病人费用明细记录(INP_BILL_DETAIL),病人主索引(PAT_MASTER_INDEX),科室字典(DEPT_DICT),病人住院主记录(PAT_VISIT),预交金记录(PREPAYMENT_RCPT)。
原来想使用住院病人费用记录表MEDICAL_COSTS,但由于该表在月报统计时,对某些欠费的病人进行费用补录,让月报程序得以进行。但是由于工作人员的疏忽,补录的费用项目及金额与实际产生的项目及金额不一致,所以只能弃用。
步骤一,查找出所有出院未结账的病人及其欠费金额
SELECT C.PATIENT_ID,
C.VISIT_ID,
B.NAME,
D.DEPT_NAME,
C.ADMISSION_DATE_TIME,
C.DISCHARGE_DATE_TIME,
C.CHARGE_TYPE,
SUM(A.COSTS),
SUM(A.CHARGES)
FROM INPBILL.INP_BILL_DETAIL A,
MEDREC.PAT_MASTER_INDEX B,
COMM.DEPT_DICT D,
MEDREC.PAT_VISIT C
WHERE ( C.DEPT_DISCHARGE_FROM = D.DEPT_CODE ) AND
( C.PATIENT_ID = B.PATIENT_ID ) AND
( C.PATIENT_ID = A.PATIENT_ID ) AND
( C.VISIT_ID = A.VISIT_ID ) AND
( C.DISCHARGE_DATE_TIME BETWEEN TO_DATE('2017-06-01','YYYY-MM-DD') AND TO_DATE('2017-07-01','YYYY-MM-DD')) AND
( A.RCPT_NO IS NULL )
GROUP BY C.PATIENT_ID,
C.VISIT_ID,
B.NAME,
D.DEPT_NAME,
C.ADMISSION_DATE_TIME,
C.DISCHARGE_DATE_TIME,
C.CHARGE_TYPE
ORDER BY C.PATIENT_ID
;
步骤二、查询出院未结账欠费病人的预交金结余金额
--方法一
SELECT A.PATIENT_ID,SUM(A.AMOUNT)
FROM PREPAYMENT_RCPT A
WHERE A.PATIENT_ID IN (SELECT DISTINCT C.PATIENT_ID FROM INP_BILL_DETAIL B,PAT_VISIT C
WHERE ((C.DISCHARGE_DATE_TIME BETWEEN TO_DATE('2017-06-01','YYYY-MM-DD') AND TO_DATE('2017-07-01','YYYY-MM-DD'))) AND
(C.PATIENT_ID = B.PATIENT_ID) AND
(C.VISIT_ID = B.VISIT_ID) AND
(B.RCPT_NO IS NULL)) AND
A.TRANSACT_TYPE <> '作废'
GROUP BY A.PATIENT_ID
;
--方法二、根据步骤一查询出来的ID号查找预交金结余金额。
SELECT A.PATIENT_ID,SUM(A.AMOUNT )
FROM PREPAYMENT_RCPT A
WHERE ( A.PATIENT_ID IN ('') ) AND
( A.TRANSACT_TYPE <> '作废' )
GROUP BY A.PATIENT_ID
;
步骤三、创建两张表,分别是预交金结余表pat_not_paymoney,出院未结账表pat_surplus_paymoney。注意:请在测试库里操作。
创建脚本语句如下:
--创建出院未结账表
-- Create table
CREATE OR REPLACE TABLE COMM.PAT_NOT_PAYMONEY
(
PATIENT_ID VARCHAR2(10),
VISIT_ID NUMBER(22) ,
NAME VARCHAR2(8) ,
DEPT_ANME VARCHAR2(26) ,
ADMISSION_DATE_TIME DATE,
DISCHARGE_DATE_TIME DATE,
CHARGE_TYPE VARCHAR2(8),
COSTS NUMBER(8,2),
CHARGES NUMBER(8,2)
)
TABLESPACE TSP_ORDADM
PCTFREE 5
INITRANS 1
MAXTRANS 255
STORAGE
(
INITIAL 1576
NEXT 512
MINEXTENTS 1
MAXEXTENTS UNLIMITED
);
CREATE PUBLIC SYNONYM PAT_NOT_PAYMONEY FOR COMM.PAT_NOT_PAYMONEY;
GRANT SELECT, INSERT, UPDATE, DELETE, ALTER ON COMM.PAT_NO_PAYMONEY TO SYSTEM;
--创建预交金结余表
-- Create table
CREATE TABLE COMM.PAT_SURPLUS_PAYMONEY
(
PATIENT_ID VARCHAR2(10),
MONEY NUMBER(8,2)
)
TABLESPACE TSP_ORDADM
PCTFREE 5
INITRANS 1
MAXTRANS 255
STORAGE
(
INITIAL 1576
NEXT 512
MINEXTENTS 1
MAXEXTENTS UNLIMITED
);
CREATE PUBLIC SYNONYM PAT_SURPLUS_PAYMONEY FOR COMM.PAT_SURPLUS_PAYMONEY;
GRANT SELECT, INSERT, UPDATE, DELETE, ALTER ON COMM.PAT_LEFT_PAYMONEY TO SYSTEM;
步骤四、导出导入数据
(先新建两个excel文档,将PATIENT_ID设置为文本格式、日期设置为自定义YYYY/MM/DD H:MM格式、COSTS/CHARGES设置为常规格式)将步骤一、二查询出来的结果另存为.XLS文档,然后使用PLSQL程序将数据分别导入pat_not_paymoney、pat_surplus_paymoney表。
步骤五、使用以下语句组合上面两张表的数据
SELECT * FROM PAT_NOT_PAYMONEY A LEFT JOIN PAT_SURPLUS_PAYMONEY B ON A.PATIENT_ID=B.PATIENT_ID;
步骤六、数据整理
将步骤五查询结果另存为.XLS文档,选中PATIENT_ID整列,利用EXCEL2007或以上版本的规则功能-条件格式-突出显示单元格规则-重复值 找出PATIENT_ID相同的病人,保留最大VISIT_ID的一次预交金结余数值,最后计算出应补多金额即可。
最后,我们来对上面的SQL查询语句进行一次汇总合并,将查询出来的欠费数据及预交金数据存放在临时表A1,A2,再关联起来,最后再使用上面的步骤六做数据整理。
SELECT A1.PATIENT_ID,A1.VISIT_ID,A1.NAME,A1.DEPT_NAME,A1.ADMISSION_DATE_TIME,A1.DISCHARGE_DATE_TIME,A1.CHARGE_TYPE,A1.COSTS,A1.CHARGES,A2.AMOUNT
FROM
(SELECT C.PATIENT_ID,
C.VISIT_ID,
B.NAME,
D.DEPT_NAME,
C.ADMISSION_DATE_TIME,
C.DISCHARGE_DATE_TIME,
C.CHARGE_TYPE,
SUM(A.COSTS) AS COSTS,
SUM(A.CHARGES) AS CHARGES
FROM INPBILL.INP_BILL_DETAIL A,
MEDREC.PAT_MASTER_INDEX B,
MEDREC.PAT_VISIT C,
COMM.DEPT_DICT D
WHERE ( C.DEPT_DISCHARGE_FROM = D.DEPT_CODE ) AND
( C.PATIENT_ID = B.PATIENT_ID ) AND
( C.PATIENT_ID = A.PATIENT_ID ) AND
( C.VISIT_ID = A.VISIT_ID ) AND
( C.DISCHARGE_DATE_TIME BETWEEN TO_DATE('2017-06-01','YYYY-MM-DD') AND TO_DATE('2017-07-01','YYYY-MM-DD')) AND
( A.RCPT_NO IS NULL )
GROUP BY C.PATIENT_ID,
C.VISIT_ID,
B.NAME,
D.DEPT_NAME,
C.ADMISSION_DATE_TIME,
C.DISCHARGE_DATE_TIME,
C.CHARGE_TYPE) A1
LEFT JOIN
(SELECT E.PATIENT_ID,
SUM(E.AMOUNT) AS AMOUNT
FROM PREPAYMENT_RCPT E
WHERE E.PATIENT_ID IN (SELECT DISTINCT G.PATIENT_ID FROM INP_BILL_DETAIL F,PAT_VISIT G
WHERE (G.PATIENT_ID = F.PATIENT_ID) AND
(G.VISIT_ID = F.VISIT_ID) AND
((G.DISCHARGE_DATE_TIME BETWEEN TO_DATE('2017-06-01','YYYY-MM-DD') AND
TO_DATE('2017-07-01','YYYY-MM-DD')))AND
(F.RCPT_NO IS NULL)) AND
E.TRANSACT_TYPE <> '作废'
GROUP BY E.PATIENT_ID) A2
ON A1.PATIENT_ID=A2.PATIENT_ID;
此SQL语句查询出来的结果只适用于一般情况下,对于那些情况特殊的,还需要人工进行细分确认。至于哪些情况特殊,维护过该HIS系统数据库的小伙伴应该都清楚,在这里就不明说了
【完毕】
怎么样,如果您觉得在下写得还行,请长按识别二维码,加关注