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.    (^ _ ^)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章