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,
sql中union多表合并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
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
group by c.sksxx02,d.sjcxx02 order by 1, 2
That's all.  Thanks for reading.    (^ _ ^)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。