--住院人数+入院人数-出院人数=在院人数select count(1) 在院人数 from table where out_date is null or to_char(in_date,'yyyymm')='201411' or to_char(out_date,'yyyymm')='201411' --out_date为null的,统计月初在院人数
大概是这个意思,你根据实际情况,折腾下面的语句吧 select sum( --月初在院病人住院天数 decode(out_date,null,sysdate-in_date,0) --本月入院人数的住院天数 +case when to_char(in_date,'yyyymm')='201411' and out_date is null then sysdate-in_date else 0 end --本月出院人数 -case when to_char(out_date,'yyyymm')='201411' then sysdate-in_date else 0 end ) 住院天数 from table where out_date is null or (to_char(in_date,'yyyymm')='201411' and out_date is null) or to_char(out_date,'yyyymm')='201411' --out_date为null的,统计期初在院人数 --住院人数+入院人数-出院人数=在院人数select count(1) 在院人数 from table where out_date is null or (to_char(in_date,'yyyymm')='201411' and out_date is null) or to_char(out_date,'yyyymm')='201411' --out_date为null的,统计月初在院人数
with T1 AS ( SELECT MIN(IN_DATE) MINDATE,MAX(OUT_DATE) MAXDATE FROM T CONNECT BY ),T2 AS ( SELECT TO_CHAR(ADD_MONTHS(MINDATE,ROWNUM-1),'YYYYMM') M FROM T1 CONNECT BY TO_CHAR(ADD_MONTHS(MINDATE,ROWNUM-1),'YYYYMM')<=TO_CHAR(MAXDATE,'YYYYMM') ) SELECT T2.M as 月份,COUNT(T1.ID) as 人数, SUM(LEAST(LAST_DAY(TO_DATE(T2.M||'01','YYYYMMDD')),TRUNC(T.OUT_DATE))- GREATEST(TO_DATE(T2.M||'01','YYYYMMDD'),TRUNC(T.IN_DATE))+1) as 人天 FROM T RIGHT JOIN T2 ON T.OUT_DATE>=TO_DATE(T2.M||'01','YYYYMMDD') AND T.IN_DATE<ADD_MONTHS(TO_DATE(T2.M||'01','YYYYMMDD') ,1)
我oracle用的不是很好。CONNECT BY 是做什么用的,我在网上查到的都是很 start with 联合起来用的
select rownum from dual connect by rownum<=10 你执行下这个语句看看效果就知道了
这种例子最好提供字段类型、测试数据 免得做无用功with tab1 as( select 1 id,sysdate-100 in_date,sysdate-80 out_date from dual union all select 2,sysdate-30,sysdate-5 from dual union all select 3 ,sysdate-10 ,null from dual union all select 4, sysdate-200,sysdate-100 from dual ) --上面的是测试数据 select ym.month_, count(1), --住院人数 sum(least(t.out_date, add_months(to_date(ym.month_ || '-01', 'YYYY-MM-DD'), 1)) - greatest(t.in_date, to_date(ym.month_ || '-01', 'YYYY-MM-DD'))) --该月所有人住院总天数 from --构造月份,这里构造的是从2013年1月起的24个月份,根据需要的来修改 (select to_char(add_months(to_date('2013-01', 'YYYY-MM'), rownum - 1), 'YYYY-MM') month_ from dual connect by rownum <= 24) YM, tab1 t where t.in_date < add_months(to_date(month_ || '-01', 'YYYY-MM-DD'), 1) and (t.out_date > to_date(month_ || '-01', 'YYYY-MM-DD') or t.out_date is null and sysdate > to_date(month_ || '-01', 'YYYY-MM-DD')) group by ym.month_
select rownum from dual connect by rownum<=10 你执行下这个语句看看效果就知道了 简单直接,一下子就懂了,我喜欢
我造的测试数据是 with tab1 as( select 1 id,to_date('2014-10-1','yyyy-MM-dd') in_date,to_date('2014-11-1','yyyy-MM-dd') out_date from dual union all select 2,to_date('2014-10-1','yyyy-MM-dd'),to_date('2014-10-23','yyyy-MM-dd') from dual union all select 3 ,to_date('2014-11-1','yyyy-MM-dd') ,to_date('2014-12-1','yyyy-MM-dd') from dual union all select 4, to_date('2014-9-1','yyyy-MM-dd'),to_date('0001-1-1','yyyy-MM-dd') from dual --to_date('0001-1-1','yyyy-MM-dd') ) 用你的sql,每个月会少30天的住院天数。 to_date('0001-1-1','yyyy-MM-dd') 表示该患者还未出院
这就属于你前面没说,突然冒出来的东西 前面写的是假设还没出院的话,出院时间是空的。如果是0001年1月1日,相应的条件和天数计算的地方需要调整下 least后面的t.out_date要换成 decode(to_char(t.out_date,'YYYY-MM-DD'),'0001-01-01',sysdate,t.out_date) 条件换成 where t.in_date < add_months(to_date(month_ || '-01', 'YYYY-MM-DD'), 1) and (t.out_date > to_date(month_ || '-01', 'YYYY-MM-DD') or t.out_date<date'0001-1-1'+1 and sysdate > to_date(month_ || '-01', 'YYYY-MM-DD'))
select sum(
--月初在院病人住院天数
decode(out_date,null,sysdate-in_date,0)
--本月入院人数的住院天数
+case when to_char(in_date,'yyyymm')='201411' and out_date is null then sysdate-in_date else 0 end
--本月出院人数
-case when to_char(out_date,'yyyymm')='201411' then sysdate-in_date else 0 end
) 住院天数
from table
where out_date is null or (to_char(in_date,'yyyymm')='201411' and out_date is null) or to_char(out_date,'yyyymm')='201411'
--out_date为null的,统计期初在院人数
--住院人数+入院人数-出院人数=在院人数select count(1) 在院人数
from table
where out_date is null or (to_char(in_date,'yyyymm')='201411' and out_date is null) or to_char(out_date,'yyyymm')='201411'
--out_date为null的,统计月初在院人数
SELECT MIN(IN_DATE) MINDATE,MAX(OUT_DATE) MAXDATE FROM T CONNECT BY
),T2 AS (
SELECT TO_CHAR(ADD_MONTHS(MINDATE,ROWNUM-1),'YYYYMM') M
FROM T1 CONNECT BY TO_CHAR(ADD_MONTHS(MINDATE,ROWNUM-1),'YYYYMM')<=TO_CHAR(MAXDATE,'YYYYMM')
)
SELECT T2.M as 月份,COUNT(T1.ID) as 人数,
SUM(LEAST(LAST_DAY(TO_DATE(T2.M||'01','YYYYMMDD')),TRUNC(T.OUT_DATE))-
GREATEST(TO_DATE(T2.M||'01','YYYYMMDD'),TRUNC(T.IN_DATE))+1) as 人天
FROM T RIGHT JOIN T2
ON T.OUT_DATE>=TO_DATE(T2.M||'01','YYYYMMDD')
AND T.IN_DATE<ADD_MONTHS(TO_DATE(T2.M||'01','YYYYMMDD') ,1)
nvl(out_date,sysdate)
我oracle用的不是很好。CONNECT BY 是做什么用的,我在网上查到的都是很 start with 联合起来用的
你执行下这个语句看看效果就知道了
免得做无用功with tab1 as(
select 1 id,sysdate-100 in_date,sysdate-80 out_date from dual
union all select 2,sysdate-30,sysdate-5 from dual
union all select 3 ,sysdate-10 ,null from dual
union all select 4, sysdate-200,sysdate-100 from dual
)
--上面的是测试数据
select ym.month_,
count(1), --住院人数
sum(least(t.out_date,
add_months(to_date(ym.month_ || '-01', 'YYYY-MM-DD'), 1)) -
greatest(t.in_date, to_date(ym.month_ || '-01', 'YYYY-MM-DD'))) --该月所有人住院总天数
from --构造月份,这里构造的是从2013年1月起的24个月份,根据需要的来修改
(select to_char(add_months(to_date('2013-01', 'YYYY-MM'), rownum - 1),
'YYYY-MM') month_
from dual
connect by rownum <= 24) YM,
tab1 t
where t.in_date < add_months(to_date(month_ || '-01', 'YYYY-MM-DD'), 1)
and (t.out_date > to_date(month_ || '-01', 'YYYY-MM-DD') or
t.out_date is null and
sysdate > to_date(month_ || '-01', 'YYYY-MM-DD'))
group by ym.month_
你执行下这个语句看看效果就知道了
简单直接,一下子就懂了,我喜欢
with tab1 as(
select 1 id,to_date('2014-10-1','yyyy-MM-dd') in_date,to_date('2014-11-1','yyyy-MM-dd') out_date from dual
union all select 2,to_date('2014-10-1','yyyy-MM-dd'),to_date('2014-10-23','yyyy-MM-dd') from dual
union all select 3 ,to_date('2014-11-1','yyyy-MM-dd') ,to_date('2014-12-1','yyyy-MM-dd') from dual
union all select 4, to_date('2014-9-1','yyyy-MM-dd'),to_date('0001-1-1','yyyy-MM-dd') from dual --to_date('0001-1-1','yyyy-MM-dd')
)
用你的sql,每个月会少30天的住院天数。
to_date('0001-1-1','yyyy-MM-dd') 表示该患者还未出院
前面写的是假设还没出院的话,出院时间是空的。如果是0001年1月1日,相应的条件和天数计算的地方需要调整下
least后面的t.out_date要换成 decode(to_char(t.out_date,'YYYY-MM-DD'),'0001-01-01',sysdate,t.out_date)
条件换成
where t.in_date < add_months(to_date(month_ || '-01', 'YYYY-MM-DD'), 1)
and (t.out_date > to_date(month_ || '-01', 'YYYY-MM-DD') or
t.out_date<date'0001-1-1'+1 and
sysdate > to_date(month_ || '-01', 'YYYY-MM-DD'))