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时,百分比格式不正确的问题。
  • 不知道还有别的问题么……?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值