欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

分享SQL中的数字格式化实例

程序员文章站 2022-05-10 21:01:43
...
用sql语句来格式化double型的数据,比如,只取出小数点后面的两位
一。主要方法

--取小数位前数字,不考虑四舍五入
select left('30000.72234', charindex('.', '30000.72234')-1)
其中:charindex('.', '30000.72234')获得小数点的位置;-1则表示在小数点前面的全部,如果想获取小数点后面的n为,写成+n就可以了。还挺好用的。

--每三位用逗号相隔,留2位小数,不考虑四舍五入
select convert(varchar, cast(round(30000.72234,0) as money), 1)

--每三位用逗号相隔,不留小数位,考虑四舍五入
select left(convert(varchar, cast(round(30000.72234,0) as money), 1) , charindex('.', convert(varchar, cast(round(30000.72234,0) as money), 1))-1)


二。CAST和 ROUND的比较
1.
SELECT CAST('123.456' as decimal) 将会得到 123(小数点后面的将会被省略掉)。
如果希望得到小数点后面的两位。
则需要把上面的改为
SELECT CAST('123.456' as decimal(38, 2))

===>123.46
自动四舍五入了!

2.
SELECT ROUND(123.75633, 2, 1),
ROUND(123.75633, 2)
上面的SQL得到的2个值是不一样的,前一个是:123.75000,后一个是:123.76000。
因为前者在进行四舍五入之前,小数点后已经被截取,保留了2位。
而后者则没有被截取,四舍五入时自然就会得到123.76000


问题:需要对在Oracle数据库中查询出来的数值进行比率的计算。类似于如下的SQL:
Select Round((discount/Amount),2) from dual;

这样算出来的数字可以满足绝大部分的需求。但是对于不到1的数字,问题出来了……显示的类似于 .45样子的数据。0.45前面的0不见了。

以下总结了两种方法来解决缺0的问题。

第一种解决方法:
SELECT DECODE (TRUNC (1/100),0, REPLACE (1/100, '.', '0.'),TO_CHAR (1/100))
FROM DUAL;

大家只要在1/100的地方替换成自己需要的百分数就可以了。

第二种解决方法:
SELECT RTrim(To_Char(1/100,'FM99999999990.9999'),'.') FROM dual;

替换方式和上面相同。

两种方式的详细比较:

第一种公式比较复杂,但可以处理通用的数值。

第二种看起来简单,不过格式化的值的位数一定要大于计算的位数才行。比如 SELECT RTrim(To_Char(200,'FM90.9999') ,'.') FROM dual; 显示的就是########,因为已经超过了格式化的范围。

--------------------

我在表tb中查出字段a的值为0.4286,怎样可以转为百分数42.9%(小数点后保留一位小数)
例如
select a from tb
0.4286
我想得到的结果为
42.9%

SQL code

select cast(cast(a*100 as decimal(18,1)) as varchar) + '%' from tb

以上就是分享SQL中的数字格式化实例的详细内容,更多请关注其它相关文章!