现在有三个表,他们的是一对多的关系检查表:EXAMS
     E_NO     |    P_NAME    |    E_DATE       |    E_SOURCE
     001      |    病人A     |    2012-02-27   |    门诊
     002      |    病人B     |    2012-02-28   |    住院
     003      |    病人C     |    2012-02-28   |    门诊检查项目表:EXAM_ITEM
    I_ID    |     E_NO    |      I_NAME     |    I_COST
    01      |     001     |      项目A      |    12
    02      |     001     |      项目B      |    13
    03      |     002     |      项目A      |    12
    04      |     003     |      项目A      |    12报告表:REPORTS
    R_ID    |      E_NO     |     R_CONTENT    |   IS_ABNORMAL
    1       |      001      |     abcdefgh     |      1
    2       |      002      |     jkljklji     |      0
    3       |      002      |     kjijesa      |      0
    4       |      003      |     jkjkljlie    |      1现在的要求是要用SQL语句查出一下格式的表:检查时间     
门诊人数     
门诊(项目A)人数       
门诊(项目B)人数   
门诊阳性例数  
住院人数     
住院(项目A)人数       
住院(项目B)人数   
住院阳性例数select EXAMS.E_DATE 检查时间,
SUM(DECODE(EXAMS.E_SOURCE,'门诊',1,0)) 门诊人数,
SUM(DECODE(EXAMS.E_SOURCE,'门诊',DECODE(EXAM_ITEM.I_NAME,'项目A',1,0),0)) 门诊(项目A)人数,
SUM(DECODE(EXAMS.E_SOURCE,'门诊',DECODE(EXAM_ITEM.I_NAME,'项目B',1,0),0)) 门诊(项目B)人数,
SUM(DECODE(EXAMS.E_SOURCE,'门诊',DECODE(REPORTS.IS_ABNORMAL,'1',1,0),0)) 门诊阳性例数,
SUM(DECODE(EXAMS.E_SOURCE,'住院',1,0)) 住院人数,
SUM(DECODE(EXAMS.E_SOURCE,'住院',DECODE(EXAM_ITEM.I_NAME,'项目A',1,0),0)) 住院(项目A)人数,
SUM(DECODE(EXAMS.E_SOURCE,'住院',DECODE(EXAM_ITEM.I_NAME,'项目B',1,0),0)) 住院(项目B)人数,
SUM(DECODE(EXAMS.E_SOURCE,'住院',DECODE(REPORTS.IS_ABNORMAL,'1',1,0),0)) 住院阳性例数
FROM EXAMS,EXAM_ITEM,REPORTS
WHERE EXAMS.E_NO = EXAM_ITEM.E_NO(+)
AND EXAMS.E_NO = REPORTS.E_NO(+)
GROUP BY EXAMS.E_DATE
ORDER BY EXAMS.E_DATE
请教这个语句怎么写?我自己写的语句统计数据不准确,要怎么样才能让这样的数据统计出来呢?

解决方案 »

  1.   

    你试试分别先统计门诊和住院的,然后在把它们union all 起来
      

  2.   

    1、
    检查项目表:EXAM_ITEM
    报告表:REPORTS
    这两张表的主键没有任何意义,要这样设计,数据库就没有主键存在的必要了。这样有多表查询时效率极低。
    2、
    SQL没看出来有问题,应该是对的
      

  3.   

    你写的语句没有问题。只需注意一点,全角半角字符select EXAMS.E_DATE 检查时间,
    SUM(DECODE(EXAMS.E_SOURCE,'门诊',1,0)) 门诊人数,
    SUM(DECODE(EXAMS.E_SOURCE,'门诊',DECODE(EXAM_ITEM.I_NAME,'项目A',1,0),0)) "门诊(项目A)人数",
    SUM(DECODE(EXAMS.E_SOURCE,'门诊',DECODE(EXAM_ITEM.I_NAME,'项目B',1,0),0)) "门诊(项目B)人数",
    SUM(DECODE(EXAMS.E_SOURCE,'门诊',DECODE(REPORTS.IS_ABNORMAL,'1',1,0),0)) 门诊阳性例数,
    SUM(DECODE(EXAMS.E_SOURCE,'住院',1,0)) 住院人数,
    SUM(DECODE(EXAMS.E_SOURCE,'住院',DECODE(EXAM_ITEM.I_NAME,'项目A',1,0),0)) "住院(项目A)人数",
    SUM(DECODE(EXAMS.E_SOURCE,'住院',DECODE(EXAM_ITEM.I_NAME,'项目B',1,0),0)) "住院(项目B)人数",
    SUM(DECODE(EXAMS.E_SOURCE,'住院',DECODE(REPORTS.IS_ABNORMAL,'1',1,0),0)) 住院阳性例数
    FROM EXAMS,EXAM_ITEM,REPORTS
    WHERE EXAMS.E_NO = EXAM_ITEM.E_NO(+)
    AND EXAMS.E_NO = REPORTS.E_NO(+)
    GROUP BY EXAMS.E_DATE
    ORDER BY EXAMS.E_DATE或者把全角的括号删了 
      

  4.   

    如何区分每一个病人,按p_name? 那么,如果重名又怎么办?
    这些问题不解决,楼主的问题永远无法搞定。
      

  5.   


    未经测试,效率不高,就复制速度一下,如下:
    select EXAMS.E_DATE 检查时间,
    (select count(1) from EXAM_ITEM item where EXAMS.E_SOURCE = '门诊' AND EXAMS.E_NO = item.E_NO AND item.I_NAME = '项目A') 门诊(项目A)人数,
    (select count(1) from EXAM_ITEM item where EXAMS.E_SOURCE = '门诊' AND EXAMS.E_NO = item.E_NO AND item.I_NAME = '项目B') 门诊(项目B)人数,
    (select count(1) from REPORTS exports where EXAMS.E_SOURCE = '门诊' AND exports.IS_ABNORMAL = '1') 门诊阳性例数,
    (select count(1) from EXAM_ITEM item where EXAMS.E_SOURCE = '住院' AND EXAMS.E_NO = item.E_NO AND item.I_NAME = '项目A') 住院(项目A)人数,
    (select count(1) from EXAM_ITEM item where EXAMS.E_SOURCE = '住院' AND EXAMS.E_NO = item.E_NO AND item.I_NAME = '项目B') 住院(项目B)人数,
    (select count(1) from REPORTS exports where EXAMS.E_SOURCE = '住院' AND exports.IS_ABNORMAL = '1') 住院阳性例数
    FROM EXAMS
    GROUP BY EXAMS.E_DATE
    ORDER BY EXAMS.E_DATE
      

  6.   

    呵呵呵,笑死我了,太可爱了,哈哈哈。select 
    EXAMS.E_DATE 检查时间,
    sub1.cnt 门诊人数,
    sub2.cnt 住院人数,
    FROM EXAMS ,
    (select count(1) cnt from EXAMS A where A.E_SOURCE = '门诊') sub1,
    (select count(1) cnt from EXAMS B where B.E_SOURCE = '住院') sub2
    Where 
    EXAMS.E_DATE = sub1.E_DATE AND EXAMS.E_DATE = sub2.E_DATE
    GROUP BY EXAMS.E_DATE
    ORDER BY EXAMS.E_DATE
      

  7.   

    因为你的表设计有缺陷,EXAM_ITEM,REPORTS 这两个表应该是有时间关联条件的。你却没有提供时间
      

  8.   


    他们是通过 E_NO关联的
      

  9.   

    最好是把你的表的ddl提供下,才好帮你在自己的机子上测试。
      

  10.   


    select count(e_no) as '门诊人数',to_char(e_date,'yyyy-mm-dd') as '检查时间' ,a1 as '门诊(项目A)人数'  ,a2 as '门诊(项目B)人数',a3 as '门诊阳性例数' from exams a,exam_item b where a.e_no=b.e_no and e_source='门诊' 
    left join (select count(e_no) from exam_item ) a1 on a.e_no=a1.e_no
    left join (select count(e_no) from exam_item ) a2 on a.e_no=a1.e_no
    left join (select count(IS_ABNORMAL) from reports where IS_ABNORMAL='0') a3 on a.e_no=a3.e_no
    group by count(e_no),to_char(e_date,'yyyy-mm-dd'),a1,a2,a3 order by to_char(e_date,'yyyy-mm-dd');union select count(e_no) as '住院人数',to_char(e_date,'yyyy-mm-dd') as '检查时间' ,a1 as '住院(项目A)人数',a2 as '住院(项目B)人数',a3 as '住院阳性例数' from exams a,exam_item b where a.e_no=b.e_no and e_source='住院' 
    left join (select count(e_no)  from exam_item ) a1 on a.e_no=a1.e_no
    left join (select count(e_no)  from exam_item ) a2 on a.e_no=a1.e_no
    left join (select count(IS_ABNORMAL)  from reports where IS_ABNORMAL='0') a3 on a.e_no=a3.e_no
    group by count(e_no),to_char(e_date,'yyyy-mm-dd'),a1,a2,a3 order by to_char(e_date,'yyyy-mm-dd')
    这是我想到的见笑了
      

  11.   


    select count(e_no) as '门诊人数',to_char(e_date,'yyyy-mm-dd') as '检查时间' ,a1 as '门诊(项目A)人数'  ,a2 as '门诊(项目B)人数',a3 as '门诊阳性例数' from exams a,exam_item b where a.e_no=b.e_no and e_source='门诊' 
    left join (select count(e_no) from exam_item where i_name='项目A') a1 on a.e_no=a1.e_no
    left join (select count(e_no) from exam_item where i_name='项目B') a2 on a.e_no=a1.e_no
    left join (select count(IS_ABNORMAL) from reports where IS_ABNORMAL='0') a3 on a.e_no=a3.e_no
    group by count(e_no),to_char(e_date,'yyyy-mm-dd'),a1,a2,a3 order by to_char(e_date,'yyyy-mm-dd');union select count(e_no) as '住院人数',to_char(e_date,'yyyy-mm-dd') as '检查时间' ,a1 as '住院(项目A)人数',a2 as '住院(项目B)人数',a3 as '住院阳性例数' from exams a,exam_item b where a.e_no=b.e_no and e_source='住院' 
    left join (select count(e_no)  from exam_item where i_name='项目A') a1 on a.e_no=a1.e_no
    left join (select count(e_no)  from exam_item where i_name='项目B' ) a2 on a.e_no=a1.e_no
    left join (select count(IS_ABNORMAL)  from reports where IS_ABNORMAL='0') a3 on a.e_no=a3.e_no
    group by count(e_no),to_char(e_date,'yyyy-mm-dd'),a1,a2,a3 order by to_char(e_date,'yyyy-mm-dd')
    额  刚才的竟然犯了那么大的错误 
      

  12.   


    select count(e_no) as '门诊人数',to_char(e_date,'yyyy-mm-dd') as '检查时间' ,a1 as '门诊(项目A)人数'  ,a2 as '门诊(项目B)人数',a3 as '门诊阳性例数' from exams a,exam_item b where a.e_no=b.e_no and e_source='门诊' 
    left join (select count(e_no) from exam_item where i_name='项目A') a1 on a.e_no=a1.e_no
    left join (select count(e_no) from exam_item where i_name='项目B') a2 on a.e_no=a2.e_no
    left join (select count(IS_ABNORMAL) from reports where IS_ABNORMAL='0') a3 on a.e_no=a3.e_no
    group by count(e_no),to_char(e_date,'yyyy-mm-dd'),a1,a2,a3 order by to_char(e_date,'yyyy-mm-dd');union select count(e_no) as '住院人数',to_char(e_date,'yyyy-mm-dd') as '检查时间' ,a1 as '住院(项目A)人数',a2 as '住院(项目B)人数',a3 as '住院阳性例数' from exams a,exam_item b where a.e_no=b.e_no and e_source='住院' 
    left join (select count(e_no)  from exam_item where i_name='项目A') a1 on a.e_no=a1.e_no
    left join (select count(e_no)  from exam_item where i_name='项目B' ) a2 on a.e_no=a2.e_no
    left join (select count(IS_ABNORMAL)  from reports where IS_ABNORMAL='0') a3 on a.e_no=a3.e_no
    group by count(e_no),to_char(e_date,'yyyy-mm-dd'),a1,a2,a3 order by to_char(e_date,'yyyy-mm-dd')
    千锤百炼 百试不爽 不好意思  改了好几遍 试一下吧 我也是新手