格式化具有任意小数位数的SQL数字查询结果

时间:2009-03-16 22:44:06

标签: sql sql-server oracle formatting decimal

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

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

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

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

我需要Oracle和SQL Server的SQL查询,它将使用正确的小数位数格式化每个数量,保留任何尾随零,如上所示。我无法使用存储过程,报告工具或Excel。

6 个答案:

答案 0 :(得分: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()。

答案 1 :(得分:1)

怎么样?

选择12345金额,2个decimalPlaces,substr(to_char(12345),1,length(to_char(12345)) - 2) || '' || substr(to_char(12345), - 2)来自dual /

     amount decimalPlaces result
 ---------- ------------- ------
     12345              2 123.45

答案 2 :(得分: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

答案 3 :(得分:1)

在SQL Server中,您可以:

select stuff(convert(varchar,amount) ,
         len(convert(varchar,amount)) - DecimalPlaces - 1, 0, ".")

答案 4 :(得分:0)

到目前为止,我能够提出的最好的是:

select Amount/power(10, DecimalPlaces) from MyTable

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

  • Oracle :尾随零被剥离,因此US $ 15.00看起来像“15”,而不是“15.00”
  • SQL Server :添加了大量额外的尾随零,因此$ 23.99看起来像“23.99000000000”而不是“23.99”

答案 5 :(得分: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