带逗号的SQL Server格式小数位

时间:2012-11-06 06:33:46

标签: sql sql-server

如何将十进制值转换为逗号?

this帮助我。但我的问题小数位只设置为2 ..我想要小数为2,3或4 ..示例

1,234.123   or    1,234.12345

我试过

convert(varchar, convert(decimal(18, 4), 1234.1234567), 1) 

输出:1234.1234

没有逗号。但如果我用钱,小数只有2

  

convert(varchar,convert(money,1234.1234567),1)

     

输出:1,234.12

5 个答案:

答案 0 :(得分:23)

谢天谢地(?),在 SQL Server 2012 + 中,您现在可以使用FORMAT()来实现此目的:

FORMAT(@s,'#,0.0000')

<小时/> 在以前的版本中,冒着看起来很丑的风险

<强> [查询]

declare @s decimal(18,10);
set @s = 1234.1234567;
select replace(convert(varchar,cast(floor(@s) as money),1),'.00',
    '.'+right(cast(@s * 10000 +10000.5 as int),4))

在第一部分中,我们使用MONEY-&gt; VARCHAR来生成逗号,但FLOOR()用于确保小数转到.00。这很容易识别,并使用移位(*10000)和CAST作为INT(截断)的混合来替换为小数位后的4位数来导出数字。

<强> [结果]

|   COLUMN_0 |
--------------
| 1,234.1235 |

但除非您必须使用SQL Server Management Studio或SQLCMD提交业务报告,否则即使可以完成,这也是 NEVER 正确的解决方案。任何前端或报告环境都具有处理显示格式的适当功能。

答案 1 :(得分:14)

不考虑这是个好主意......

select dbo.F_AddThousandSeparators(convert(varchar, convert(decimal(18, 4), 1234.1234567), 1))

功能

-- Author:      bummi
-- Create date: 20121106
CREATE FUNCTION F_AddThousandSeparators(@NumStr varchar(50)) 
RETURNS Varchar(50)
AS
BEGIN
declare @OutStr varchar(50)
declare @i int
declare @run int

Select @i=CHARINDEX('.',@NumStr)
if @i=0 
    begin
    set @i=LEN(@NumStr)
    Set @Outstr=''
    end
else
    begin   
     Set @Outstr=SUBSTRING(@NUmStr,@i,50)
     Set @i=@i -1
    end 


Set @run=0

While @i>0
    begin
      if @Run=3
        begin
          Set @Outstr=','+@Outstr
          Set @run=0
        end
      Set @Outstr=SUBSTRING(@NumStr,@i,1) +@Outstr  
      Set @i=@i-1
      Set @run=@run + 1     
    end

    RETURN @OutStr

END
GO

答案 2 :(得分:6)

从相关的SO问题: Format a number with commas but without decimals in SQL Server 2008 R2?

SELECT CONVERT(varchar, CAST(1112 AS money), 1)

这是在SQL Server 2008 R2中测试的。

答案 3 :(得分:2)

如果您使用的是SQL Azure Reporting Services,则不支持“格式”功能。这实际上是在SSRS中格式化图表中工具提示的唯一方法。因此,解决方法是返回一个列,该列具有用于工具提示的格式化数字的字符串表示形式。所以,我同意SQL不是格式化的地方。除非在这种情况下,工具没有适当的功能来处理显示格式。

在我的情况下,我需要显示一个用逗号和无小数格式化的数字(类型为十进制2),并在我的数据集查询中以计算列的宝石结束:

,Fmt_DDS = reverse(stuff(反向(CONVERT(varchar(25),cast(SUM(kv.DeepDiveSavingsEst)为money),1)),1,3,'')

它有效,但对于那些在路上保持报告的人来说,这是非常丑陋和不明显的。耶云!

答案 4 :(得分:-1)

SQL(或更准确地说,RDBMS)并不是格式化输出的正确选择。数据库应提供原始数据,然后应在目标应用程序中格式化(或更一般地:处理)。

但是,根据您使用的特定系统,您可以编写UDF(用户定义的函数)来实现您想要的功能。但请记住,您实际上正在返回一个varchar,您将无法进一步处理(例如汇总)。