[英]Formatting an SQL numeric query result with an arbitrary number of decimal places
我有一个包含这两列的数据库表:
该表可以存储各种货币的金额,从金额中删除小数位(我无法更改此数据模型)。 例如,可能有两行这样的:
我需要一个 SQL 查询 Oracle 和 SQL 服务器,它将使用正确的小数位数格式化每个金额,并保留上面所示的任何尾随零。 我不能使用存储过程、报告工具或 Excel。
您的问题是,在一个查询中对 SQLServer 和 Oracle 都没有简单的方法来执行此操作。
对 SQLServer 执行此操作的正确方法是使用 STR:
Select STR(Amount, 18, DecimalPlaces) from myTable;
为 Oracle 执行此操作的正确方法是使用 to_char:
SELECT to_char (amount, '99999999999999.'||rpad('',DecimalPlaces, '0'))
from MyTable;
jms 和 Andrew 提出的查询在 Oracle 查询中不起作用,因为 Oracle SQL 使用 LENGTH() 而不是 LEN()。 Oracle 使用 to_char() 而不是 Cast()。
怎么样?
select 12345 数量,2 个小数位,substr(to_char(12345),1,长度(to_char(12345))-2)|| '。' || substr( to_char( 12345 ), -2 ) 双重结果 /
amount decimalPlaces result
---------- ------------- ------
12345 2 123.45
这很严重,但适用于 SQL 服务器上的当前输入。
select
substring(
CAST(
CAST(
(amount * power(-0.100000000000000000,decimalPlaces*1.000000000000000000)) as numeric(36,18)
)as varchar(30)
)
,1,len(cast(amount as varchar(20))) + (CASE WHEN decimalPlaces = 0 THEN 0 ELSE 1 END ))
from
myTable
在 SQL 服务器中,您可以:
select stuff(convert(varchar,amount) ,
len(convert(varchar,amount)) - DecimalPlaces - 1, 0, ".")
到目前为止,我能想到的最好的是:
select Amount/power(10, DecimalPlaces) from MyTable
但它并不完全符合我的要求:
Martlark 对 Oracle 的回答让我找到了 SQL 服务器的解决方案:
select
left(cast(Amount as varchar), len(cast(Amount as varchar)) - DecimalPlaces) +
left('.', DecimalPlaces) +
right(cast(OriginalCurrencyAmount as varchar), DecimalPlaces
) as FormattedAmount
from MyTable
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.