• 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类型等类型也会有类似的问题。

  • 相关阅读:
    考虑人机协同的智能工厂多AGV物流调度仿真研究
    c++开发面试题
    【手把手带你刷好题】Java刷题记录 09—>>14
    深度学习的初始化(暂时)
    Centos7配置阿里云的yum源详细步骤
    2023 MathorCup(妈妈杯) 数学建模挑战赛B题完整解题思路+模型+代码
    LeetCode 算法:盛最多水的容器c++
    【Mycat2实战】三、Mycat实现读写分离
    【Java基础 | IO流】File类概述和常用方法使用
    【MY杂记】- SpringBoot 配置全局 Json 序列化与反序列化
  • 原文地址:https://blog.csdn.net/luckjump/article/details/126668270