3

我有一个包含这两列的数据库表:

  • 金额:数字(18,0)
  • DecimalPlaces:数字 (18,0)

该表可以存储各种货币的金额,从金额中删除小数位(我无法更改此数据模型)。例如,可能有两行这样的:

  • 1290, 2(这是 12.90 英镑,需要显示为“12.90”)
  • 3400, 0(这是3400日元,需要显示为“3400”)

我需要一个针对 Oracle 和 SQL Server 的 SQL 查询,它将使用正确的小数位数格式化每个金额,并保留任何尾随零,如上图所示。我不能使用存储过程、报告工具或 Excel。

4

6 回答 6

3

您的问题是,在一个查询中对 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()。

于 2009-03-17T05:03:00.290 回答
1

到目前为止,我能想到的最好的是:

select Amount/power(10, DecimalPlaces) from MyTable

但它并不完全符合我的要求:

  • 甲骨文:尾随零被去除,所以 15.00 美元看起来像“15”,而不是“15.00”
  • SQL Server:添加了大量额外的尾随零,因此 $23.99 看起来像“23.99000000000”而不是“23.99”
于 2009-03-16T22:48:46.040 回答
1

怎么样?

选择 12345 数量,2 个小数位,substr(to_char(12345),1,长度(to_char(12345))-2)|| '。' || substr( to_char( 12345 ), -2 ) 双重结果 /

     amount decimalPlaces result
 ---------- ------------- ------
     12345              2 123.45
于 2009-03-16T23:05:09.183 回答
1

这很严重,但适用于 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
于 2009-03-16T23:49:00.263 回答
1

在 SQL 服务器中,您可以:

select stuff(convert(varchar,amount) ,
         len(convert(varchar,amount)) - DecimalPlaces - 1, 0, ".")
于 2009-03-17T05:59:41.823 回答
0

Martlark 对 Oracle 的回答让我想到了这个 SQL Server 解决方案:

select
  left(cast(Amount as varchar), len(cast(Amount as varchar)) - DecimalPlaces) +
  left('.', DecimalPlaces) +
  right(cast(OriginalCurrencyAmount as varchar), DecimalPlaces
) as FormattedAmount
from MyTable
于 2009-03-16T23:46:18.333 回答