Oracle 如何将某一行记录放在查询结果的第一行【最后一行】

时间:2022-10-13 19:42:43

场景:已知药品费用所占比例的公式是药品费用与总费用之间的比例,通过如下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    

执行结果如下:

Oracle 如何将某一行记录放在查询结果的第一行【最后一行】Oracle 如何将某一行记录放在查询结果的第一行【最后一行】Oracle 如何将某一行记录放在查询结果的第一行【最后一行】
要求:查询出这些机构的总药品费用所占比例,并且把总药品费用所占比例的那行记录放在第一条,并且其他数据按药品费用所占比例降序排序。

第一步:应该查询到总药品费用所占比例,注意总药品费用所占比例并不是所有机构的药品费用所占比例的平均值,而是所有机构的药品总费用与总费用之间的比例,此时用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

执行结果如下:

Oracle 如何将某一行记录放在查询结果的第一行【最后一行】Oracle 如何将某一行记录放在查询结果的第一行【最后一行】

Oracle 如何将某一行记录放在查询结果的第一行【最后一行】同理,若要求将总药品费用所占比例那行记录放在最后一行,只需把最后一行语句修改为 order by flag nulls first,drug_proportion desc即可。

总结:找出需要特殊排序的那行记录(该记录一定具备可以与其他记录区分出来的某种特性,如本例中是org_id为空),并为其另构造一个排序字段完成排序功能。