一、最初(最簡單的入門實例,單個分類彙總)
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. (^ _ ^)