--住院人数+入院人数-出院人数=在院人数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的,统计月初在院人数

解决方案 »

  1.   

    大概是这个意思,你根据实际情况,折腾下面的语句吧
    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的,统计月初在院人数
      

  2.   

    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)
      

  3.   

    对于out_date为空的直接使用nvl替换为sysdate即可
    nvl(out_date,sysdate)
      

  4.   


    我oracle用的不是很好。CONNECT BY 是做什么用的,我在网上查到的都是很 start with 联合起来用的
      

  5.   

    select rownum from dual connect by rownum<=10
    你执行下这个语句看看效果就知道了
      

  6.   

    这种例子最好提供字段类型、测试数据
    免得做无用功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_
      

  7.   

    select rownum from dual connect by rownum<=10
    你执行下这个语句看看效果就知道了
    简单直接,一下子就懂了,我喜欢
      

  8.   

    我造的测试数据是
    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') 表示该患者还未出院
      

  9.   

    这就属于你前面没说,突然冒出来的东西
    前面写的是假设还没出院的话,出院时间是空的。如果是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'))