1. 程式人生 > >Oracle 如何將某一行記錄放在查詢結果的第一行【最後一行】

Oracle 如何將某一行記錄放在查詢結果的第一行【最後一行】

場景:已知藥品費用所佔比例的公式是藥品費用與總費用之間的比例,通過如下SQL語句已求出各個機構的藥品費用所佔比例,

查詢各機構藥品費用所佔比例的SQL語句:

   select
        t1.parent_id org_id, --機構id
        decode(sum(t.charge_money), 0, 0, round(sum(t.drug_money) / sum(t.charge_money) * 100, 2)) drug_proportion --藥品費用所佔比例
        from inp_discharge_day t, sys_org t1
        
        where t.org_id = t1.org_id
        and t.discharge_date>= to_date('2017-05-01', 'yyyy-mm-dd')
        and t.discharge_date <=to_date('2017-10-31', 'yyyy-mm-dd')
        group by  t1.parent_id    

執行結果如下:


要求:查詢出這些機構的總藥品費用所佔比例,並且把總藥品費用所佔比例的那行記錄放在第一條,並且其他資料按藥品費用所佔比例降序排序。

第一步:應該查詢到總藥品費用所佔比例,注意總藥品費用所佔比例並不是所有機構的藥品費用所佔比例的平均值,而是所有機構的藥品總費用與總費用之間的比例,此時用group by rollup 語句可以查詢出所有機構的總藥品費用和總費用;

第二步:找出把總藥品費用所佔比例那行記錄,併為其生成一個標誌欄位 flag 並賦值 1(flag 的值可自取)。先按照 flag 欄位排序,將 flag 不為空的放在最前面,然後再按藥品費用所佔比例降序排序。

最終要求的SQL語句:

--第二步
select org_id,
       decode(sum(charge_money), 0, 0, round(sum(drug_money) / sum(charge_money) * 100, 2)) drug_proportion,--藥品費用所佔比例
       (case when org_id is null then 1 else null end) flag
from 
      (
       --第一步
       select t1.parent_id org_id, --機構id
               sum(t.charge_money) charge_money,--藥品費用
               sum(t.drug_money) drug_money --總費用
          from inp_discharge_day t, sys_org t1
        
         where t.org_id = t1.org_id
           and t.discharge_date >= to_date('2017-05-01', 'yyyy-mm-dd')
           and t.discharge_date <= to_date('2017-10-31', 'yyyy-mm-dd')
         group by rollup(t1.parent_id)
        
        ) 
         group by org_id
        order by flag nulls last,drug_proportion desc

執行結果如下:


同理,若要求將總藥品費用所佔比例那行記錄放在最後一行,只需把最後一行語句修改為 order by flag nulls first,drug_proportion desc即可。

總結:找出需要特殊排序的那行記錄(該記錄一定具備可以與其他記錄區分出來的某種特性,如本例中是org_id為空),併為其另構造一個排序欄位完成排序功能。