SQL选出2个指标的百分比+保留小数点2位+不要除以0+分子为0也保持格式

语句

select t1.Item_date, nvl(v2,0) as "2G用户数", v1 as "总用户数", 
case v1 when 0 then '无' --分母为0,不做计算。
else 
 case nvl(v2,0) when 0 then '0.00%' --分子为0,修正格式。
 else to_char(round(v2*100/v1,2),'FM9999999999999999.00')||'%' --round(v2*100/v1,2) 
 end
end as "百分比"
from
(select Item_Date,value v1 -- 总用户数
from STAT_ITEM_DATA where Item_id=10010001 and extend_field1=19
) t1
,
(select Item_Date,value v2 -- GPRS用户数
from STAT_ITEM_DATA where Item_id=10010002 and extend_field1=19
) t2
where t1.ITEM_DATE = t2.ITEM_DATE(+) -- 需要考虑某天仅有分母的情况
order by Item_Date

测试结果

在这里插入图片描述

逐个解决

  • 指标在同一张表里面,需要用子查询分别选出,用日期进行关联。
  • 总用户数指标存在,但是分子指标不存在的日期,关联需要用(+),并且取值从空改为0,也就是用nvl(空值,0)。
  • 用 case 避免分母为0还进行除法。
  • 用 to_char(round(分子*100/分母,保留小数几位),‘FM9999999999999999.00’)||’%’ 来格式化百分比显示(当然还有很多其它的办法,这里只是一种)。
  • 再用 case 避免分子为0时,百分比格式不正确的问题。
  • 不知道还有别的问题么……?

Guess you like

Origin blog.csdn.net/ddrfan/article/details/114091710