oracle 有如下几张表:
病人表(T_PATIENT),用来记录病人的基本情况:
t_id 主键
t_name 病人姓名
t_address 病人籍贯
t_input_date 录入时间
复诊表(T_MID),用于记录病人的复诊情况,每复诊一次就插入一条记录:
m_id 主键
t_id 病人表主键
m_address 病人复诊地区
m_state 病人复诊的状态,1为死亡,2为停止复诊,3为转诊到其他地区
m_mid_date 病人复诊日期,如果病人死亡或者转诊到其他地区,则为空
m_trans_date 病人转诊到其他地区的时间,如果没有转诊,则为空
m_death_date 病人死亡日期,如果没有死亡则为空
m_mid_or_trans_or_death_date 用于记录病人复诊、转诊或死亡日期
r_id 转诊表主键,如果病人没有转诊,则为空
转诊表(T_TRANS),用于记录病人转诊的信息,比如从A地区转入B地区
r_id 转诊表主键
t_id 病人表主键
r_yaddress 病人原治疗地区
r_toaddress病人转入地区
病人最新状态表(T_STATE),用于记录病人的状态,如病人当前治疗地区、病人的复诊状态:
s_id 主键
t_id 病人表主键
s_cur_address 病人当前治疗地区
s_cur_state 病人目前状态,1为死亡,2为停止复诊,3为转到其他地区
s_last_mid_date 病人最近一次复诊或转到其他地区或死亡日期
业务简介:
如果病人转诊,那么需要先手工填写病人的转诊表,然后在复诊表中填写一条该病人复诊状态为“转诊到其他地区”的记录,病人真正转出的时间是复诊表的转诊时间。
每次添加修改或者删除基本信息表、复诊表的记录,我都会用触发器来更新病人最新状态表(T_STATE),用于保证病人状态的正确性
新增病人不包括转入的。转出的也不需要扣除。同一个人转入转出多次按最后一次来算。最新状态表中的“最新”是指,不新的将会被更新。最新状态表和基本信息表是一对一的关系。。
现在我需要这样一个统计sql,这个sql将会在每月5号自动执行:
按病人表(T_PATIENT)的病人籍贯t_address字段来统计(group by t_address):
该地区病人的总人数、2009年9月份该地区新增人数,2009年9月该地区死亡人数、2009年9月份从其他地区转入到该地区的人数,2009年9月份该地区停止复诊的人数。
------解决方案--------------------------------------------------------
学习下!
------解决方案--------------------------------------------------------
目前只想到一个傻方法,写5个子查询,以地区为条件内连接。
方法比较傻,仅供LZ参考
------解决方案--------------------------------------------------------
根据T_STATE表来进行统计可否?
- SQL code
select sum(num) '总人数', a.*from( select s_cur_address,to_char(add_months(trunc(s_last_mid_date),-1),'yyyymm'),count(*) num from T_STATE group by s_cur_address,to_char(add_months(trunc(s_last_mid_date),-1),'yyyymm'))a;
------解决方案--------------------------------------------------------
学习学习