2012-11-06 144 views
11

如何将十进制值转换为逗号?SQL Server格式小数点后加逗号

this帮助我。但我的问题的小数位设置为2 only..I想十进制为2,3,或4..example

1,234.123 or 1,234.12345 

我试图

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

输出:1234.1234

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

转换(VARCHAR,转换(金钱,1234.1234567),1)

输出:1,234.12

+3

数字没有格式。当你将它们转换为字符串时,它们只会获得格式***,这是为了演示而完成的。而你的数据层应该不会关心表示。这是呃,什么是表示层。从SQL中,您应该返回原生数据类型,并仅将其转换为前端的演示文稿。 * [这通过解耦,可维护性,灵活性/适应性等来帮助调试,性能和体系结构等]]] – MatBailie

+1

关于表示层达成共识,但有一些有效的案例。我必须在SSMS中构建即席查询,然后通过电子邮件发送结果。这是我发送电子邮件之前需要处理的一个步骤。 –

+0

我同意;格式应该在表示层完成。 但SSMS是表示层。我还写了即席查询,然后将结果粘贴到“最终用户”(即老板和/或会计师)的电子表格中。 我现在挣扎,因为SSMS使小数点,电子表格需要十进制的逗号。 理想情况下,我应该通过“SET DECIMAL_FORMAT =”DA_dk“或SSMS中的某些选项来更改十进制格式。 –

回答

11

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

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 @[email protected] -1 
    end 


Set @run=0 

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

    RETURN @OutStr 

END 
GO 
+2

Upvoted实际提供了一个解决方案,同时警告这不是最好的方法! – callisto

-1

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

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

+2

”SQL ..并不意味着它是格式化输出的正确选择“ - 是,这是真正的问题,在UI端格式化输出也容易得多 – callisto

+0

这不是一个答案,这只是说有可能做到这一点 –

+0

重申D-Money所说的话,这不是一个答案 – Alban

20

值得庆幸的是(?),在SQL 服务器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)) 

在第一部分中,我们使用洗钱> VARCHAR生产逗号,但FLOOR()是用于确保小数点数为.00。这很容易识别,并且使用移位(*10000)和CAST作为INT(截断)的混合来导出数字,在小数点后面的4位数字替换。

结果

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

但除非你有使用SQL Server Management Studio或SQLCMD提供业务介绍,这是NEVER正确的解决方案,即使是可以做到的。任何前端或报告环境都有适当的功能来处理显示格式。

+1

第一遍,我找不到指向文档的链接特定的格式约定('#,0.0000'字符串)链接*被隐藏在您引用的页面中,但花了我一段时间才找到它。其他人的便利,这里是:[自定义数字格式字符串](https://msdn.microsoft.com/library/0c899ak8.aspx) – kmote

+0

你可以使用它作为'.00'替换字符串:'SUBSTRING( CONVERT(VarChar,@ s-FLOOR(@s)+0.00005),2,1 + 4)'这会给你“.1235” - 我发现对于实际舍入量应用更明显,但也许不会对于指定的小数位数'+ 4'非常直接清楚。当然,这只适用于正数量:) –

2

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

在我的情况我需要显示用逗号格式化的号码和没有小数(decimal类型2),在我的数据集查询结束了这种宝石计算列的:

,Fmt_DDS =反向(东西( (CONVERT(varchar(25),cast(SUM(kv.DeepDiveSavingsEst)as money),1)),1,3,''))

它可以工作,但对于任何人来说都非常丑陋和不明显保持报道顺利。 Yay Cloud!

4

从相关的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的测试。

+0

资金被认为是一种糟糕的格式,它在某些情况下使用这些值执行某些操作时会趋向于结果。即使微软自己也建议不要使用这种类型。 –

+0

@JurijsKastanovs,我同意,不要使用金钱进行任何计算或存储数据。但是,如果您有特定要求在数据层中格式化数字(可能用于在SSMS中显示),则这是执行此操作的一种方法。它应该是对数据执行的最后一次操作。 –