• AnalyticDB Mysql(ADB分析型数据库)-数值相除转字符串小数点后出现很多0拼接%后出现很多0


    数值相除拼接%后出现很多0数值转字符串后小数点后出现很多0

    ADB分析型数据库,是阿里云平台上资源,原名叫云原生数据仓库AnalyticDB Mysql,俗称ADB分析型数据库,那么ADB的语法与mysql关系型数据库语法存在一定的差异。

    问题

    在sql脚本开发过程中,计算比例,返回带百分号的字段需求。

    例如: 要返回同比增长率为 75.55%
    开发人员所写脚本思路如下:

    1. 得到计算比例的比值
    2. 将比值保留小数点两位小数
    3. 将保留两位小数后的数值拼接一个%返回
    -- 错误脚本如下:
    select  decimal_1/decimal_2 as 比例,
    		round(decimal_1/decimal_2*100,2) as 比例保留两位小数,
    		(round(decimal_1/decimal_2*100,2)||'%') as 拼接百分号	
    from (
    		select cast(12.36 as decimal(16, 2)) as decimal_1,
    		       cast(16.36 as decimal(16, 2)) as decimal_2
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    查询结果:

    错误示范

    解决办法

    一般人解决这个问题的办法是,在如上的结果,再用substring函数截取字符串得到符合条件的数据,虽然可以实现,但是不推荐。

    出现这个问题的原因,decimal类型数据相除后,增加了精度,在转成字符串的时候,会将精度释放出来。
    解决这个问题的方法也很简单:换个思路不使用round函数改用cast函数即可解决问题。

    示例脚本:

    select  decimal_1/decimal_2 as 比例,
    		round(decimal_1/decimal_2,2) as 比例保留两位小数,
    		cast(decimal_1/decimal_2  as varchar(16))as 比例转字符串,
    		cast(round(decimal_1/decimal_2,2) as varchar(16))as 比例保留两位小数转字符串,
    		concat(round(decimal_1/decimal_2,2),'%') as 比例保留两位小数加百分号,
    		cast(decimal_1/decimal_2 as decimal(16, 2))as 正确的比例保留两位小数,
    		concat(cast(decimal_1/decimal_2 as decimal(16, 2)),'%') as 正确的比例保留两位小数加百分号
    from (
    	select cast(12.36 as decimal(16, 2)) as decimal_1,
    		   cast(16.36 as decimal(16, 2)) as decimal_2
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    查询结果:
    decimal正确示范

    补充

    不仅仅是decimal类型的数值会出现此问题,NUMERIC类型等类型也会有类似的问题。

  • 相关阅读:
    两化融合企业申报奖励制度
    计算机网络:局域网的基本概念和体系结构
    预告|易天光通信将亮相第24届CIOE光博会
    Node.js详解(--模块内容详解(同步与异步,fs,url))
    无头单向非循环链表
    树莓派——5、Ubuntu18-04虚拟机搭建VMware版本
    【压缩感知 SDA】A Deep Learning Approach to Structured Signal Recovery
    React高级特性之context
    python实现图片与视频转换:将视频保存为图片,将批量图片保存为视频
    【Java面试题】List如何一边遍历,一边删除?
  • 原文地址:https://blog.csdn.net/luckjump/article/details/126668270