一、最初(最简单的入门实例,单个分类汇总)
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. (^ _ ^)