sql查询语句_多字段分类汇总_多表合并

 

 一、最初(最简单的入门实例,单个分类汇总)
1,查询语句/*药品费用分科室汇总*/
select c.sksxx02,sum(nvl(b.nfyxx06,0))   
     from yygli60 a,yygli30 b,yygl140 c,yygl101 d
     where  b.szybh01 = a.szybh01 and
                  a.sjsdh01=b.sjsdh01 and  
                  b.SFYXX13 = '1'  and                       /*审核标志1*/ 
                 djsxx03>=to_date('2011-07-01','yyyy-mm-dd') and djsxx03 < to_date('2011-08-01','yyyy-mm-dd')  and       
                 b.Sfyxx23 ='0010' and  /*用药科室为手术室*/        
                 b.sjflb01 like 'BD01%' and      /*计费类别为BD01药品收入*/ 
                 c.sksxx01=b.sfyxx14 and            /*翻译就诊科室*/
                 d.sjcxx01= substr(b.sjflb01,1,8 ) /*翻译计费类别*/
      group by c.sksxx02

2,查询语句详解。
先将医嘱表yygli30 b(如下图1)和yygli60 a(结算表),yygl140 c(科室字典表),yygl101 d(基础字典表)关联起来成一个大的非常非常宽的表
再通过where子句,筛选出结帐时间在2011年7月1号至8月1号的病人的医嘱,以及计费类别凡属于BD01药品收入的,以及用药科室,即登帐科室为手术室的医嘱;
最后用group by c.sksxx02,即按就诊科室的中文名,分类汇总,注意汇总的是医嘱表费用那一项“sum(nvl(b.nfyxx06,0))    ”。
所得到的查询结果见下图2

图1,医嘱表i30

住院号

就诊科室

记费类别

项目名称

费用

执行科室

2011004123

妇产科/三病室

麻醉费

联合腰麻

300

手术室

2011004123

妇产科/三病室

特殊材料费

联合腰麻包

100

手术室

2011004123

妇产科/三病室

西药费

利多卡因注射液

0.38

手术室

2011004436

骨病科

麻醉费

硬膜外阻滞麻醉

250

手术室

 

图2,查询结果

科室

总费用

妇产科/三病室

7259.01

骨病科

173.88

骨外科/四病室

3405.119

外二科/八病室

5954.64

外一科/五病室

6875.698

五官科/九病室

938.189

二、稍微复杂点的查询(两个字段的分类汇总)
1,查询语句/*医疗费用按科室分类汇总*/
select c.sksxx02,d.sjcxx02 as lb,
            sum(nvl(b.nfyxx06,0)) as fy
     from V_ZYJZ b,yygli60 a,yygl140 c,yygl101 d
         where  b.szybh01 = a.szybh01 and
                      a.sjsdh01=b.sjsdh01 and 
                      djsxx03>=to_date('2011-07-01','yyyy-mm-dd') and djsxx03 < to_date('2011-08-01','yyyy-mm-dd')  and 
                      b.Szxks01='0010' and                /*限定执行科室*/
                      c.sksxx01=b.sfyxx14 and            /*翻译就诊科室*/
                      d.sjcxx01= substr(b.sjflb01,1,8 ) /*翻译计费类别*/
        group by c.sksxx02,d.sjcxx02

2,查询语句详解。
先将视图V_ZYJZ b(如下图1)和yygli60 a(结算表),yygl140 c(科室字典表),yygl101 d(基础字典表)关联起来,成一个大表;
再通过where子句,筛选出结帐时间在2011年7月1号至8月1号的病人的医嘱,以及医嘱执行科室为手术室的医嘱,注意此处医嘱表中的计费类别列未做限定;
最后用group by c.sksxx02, d.sjcxx02 ,即先按“就诊科室的中文名”,分类汇总,注意汇总的还是医嘱表费用那一项“sum(nvl(b.nfyxx06,0))”,再按“计费类别的中文名”,把各科室的汇总表(如上面单个分类汇总语句的图2,查询结果),分得各详细每一个科室又以不同的计费类别进行费用的汇总。所得到的查询结果见下图2

图1,视图(长期医嘱表i30   UNION ALL    临时医嘱表i21)

住院号

就诊科室

记费类别

项目名称

费用

执行科室

2011004123

妇产科/三病室

麻醉费

联合腰麻

300

手术室

2011004123

妇产科/三病室

特殊材料费

联合腰麻包

100

手术室

2011004123

妇产科/三病室

西药费

利多卡因注射液

0.38

手术室

2011004436

骨病科

麻醉费

硬膜外阻滞麻醉

250

手术室

 

图2,多字段汇总的查询结果

科室

计费类别

费用

妇产科/三病室

麻醉费

17725

妇产科/三病室

手术费

36718

妇产科/三病室

西药费

7259.01

骨病科

麻醉费

1546



三、用"UNION ALL"语句将上面两个sql语句的结果合并
1,注意第一个语句的查询列数与第二个不一致,于是把第一个语句增加计费类别一列。
select c.sksxx02,d.sjcxx02 as lb,sum(nvl(b.nfyxx06,0))   
     from yygli60 a,yygli30 b,yygl140 c,yygl101 d
     where  b.szybh01 = a.szybh01 and
                  b.SFYXX13 = '1'  and                       /*审核标志1*/ 
                 djsxx03>=to_date('2011-07-01','yyyy-mm-dd') and djsxx03 < to_date('2011-08-01','yyyy-mm-dd')  and
                 a.sjsdh01=b.sjsdh01 and
                 b.Sfyxx23 ='0010' and  /*用药科室为手术室*/        
                 b.sjflb01 like 'BD01%' and      /*计费类别为BD01药品收入*/ 
                 c.sksxx01=b.sfyxx14 and            /*翻译就诊科室*/
                d.sjcxx01= substr(b.sjflb01,1,8 ) /*翻译计费类别*/
      group by c.sksxx02,d.sjcxx02
2,再使用"UNION ALL",把两个语句合并
    /*第一步,医疗费用按科室分类汇总*/
   select c.sksxx02,d.sjcxx02 as lb,
            sum(nvl(b.nfyxx06,0)) as fy
     from V_ZYJZ b,yygli60 a,yygl140 c,yygl101 d
     where  b.szybh01 = a.szybh01 and
    djsxx03>=to_date('2011-07-01','yyyy-mm-dd') and djsxx03 < to_date('2011-08-01','yyyy-mm-dd')  and
    a.sjsdh01=b.sjsdh01 and
        b.Szxks01='0010' and                /*限定执行科室*/
        c.sksxx01=b.sfyxx14 and            /*翻译就诊科室*/
        d.sjcxx01= substr(b.sjflb01,1,8 ) /*翻译计费类别*/
   group by c.sksxx02,d.sjcxx02

Union all  

     /*第二步,药品费用分科室汇总*/
     select c.sksxx02,d.sjcxx02 as lb,sum(nvl(b.nfyxx06,0))   
     from yygli60 a,yygli30 b,yygl140 c,yygl101 d
     where  b.szybh01 = a.szybh01 and
            b.SFYXX13 = '1'  and                       /*审核标志1*/ 
      djsxx03>=to_date('2011-07-01','yyyy-mm-dd') and djsxx03 < to_date('2011-08-01','yyyy-mm-dd')  and
      a.sjsdh01=b.sjsdh01 and
            b.Sfyxx23 ='0010' and  /*用药科室为手术室*/        
            b.sjflb01 like 'BD01%' and      /*计费类别为BD01药品收入*/ 
            c.sksxx01=b.sfyxx14 and            /*翻译就诊科室*/
            d.sjcxx01= substr(b.sjflb01,1,8 ) /*翻译计费类别*/
      group by c.sksxx02,d.sjcxx02
   
3,可以使用"order by",对最后的结果排序,注意这个order by是针对整个unioning后的结果集的。
注意,为了避免合并的多个表排序的列名可能不一致,查询会报错,我们可以使用列序号代替实际列名,如"order by 1, 2"

/*第一步,医疗费用按科室分类汇总*/
select c.sksxx02,d.sjcxx02 as lb,
            sum(nvl(b.nfyxx06,0)) as fy
     from V_ZYJZ b,yygli60 a,yygl140 c,yygl101 d
     where  b.szybh01 = a.szybh01 and
    djsxx03>=to_date('2011-07-01','yyyy-mm-dd') and djsxx03 < to_date('2011-08-01','yyyy-mm-dd')  and
    a.sjsdh01=b.sjsdh01 and
        b.Szxks01='0010' and                /*限定执行科室*/
        c.sksxx01=b.sfyxx14 and            /*翻译就诊科室*/
        d.sjcxx01= substr(b.sjflb01,1,8 ) /*翻译计费类别*/
  group by c.sksxx02,d.sjcxx02
Union all  
/*第二步,药品费用分科室汇总*/
select c.sksxx02,d.sjcxx02 as lb,sum(nvl(b.nfyxx06,0))   
     from yygli60 a,yygli30 b,yygl140 c,yygl101 d
     where  b.szybh01 = a.szybh01 and
            b.SFYXX13 = '1'  and                       /*审核标志1*/ 
      djsxx03>=to_date('2011-07-01','yyyy-mm-dd') and djsxx03 < to_date('2011-08-01','yyyy-mm-dd')  and
      a.sjsdh01=b.sjsdh01 and
            b.Sfyxx23 ='0010' and  /*用药科室为手术室*/        
            b.sjflb01 like 'BD01%' and      /*计费类别为BD01药品收入*/ 
            c.sksxx01=b.sfyxx14 and            /*翻译就诊科室*/
            d.sjcxx01= substr(b.sjflb01,1,8 ) /*翻译计费类别*/
      group by c.sksxx02,d.sjcxx02
order by 1, 2



That's all.  Thanks for reading.    (^ _ ^)

你可能感兴趣的:(数据库运用)