2014-09-29 119 views
9

我有一个查询字符串,它返回一个有小数位的值。我想将其格式设置为123.45美元。SQL Server 2008:如何将输出格式化为货币

下面是该查询:

SELECT COALESCE(SUM(SUBTOTAL),0) 
FROM dbo.SALESORD_HDR 
where ORDERDATE = datediff(d,0,getdate()) 
and STATUS NOT IN (3,6) 

我想要的结果在货币与2位小数。

+0

你的意思是一个“真正的”货币,一个可以处理各种文化格式的货币?类似于在SQL Server 2012中启动的FORMAT函数(http://msdn.microsoft.com/zh-cn/library/hh213505.aspx)? – 2014-09-29 02:02:00

+0

不,只是一种文化(en-us)为新西兰元$#,###。00 – Bevan 2014-09-29 02:12:47

+1

好的。我仍然添加了一个答案,以说明完整的格式(即货币符号,符号位置,千位分隔符和小数点)。但要清楚,你需要千位分隔符(正如你的评论中所示),对吧? – 2014-09-29 02:18:15

回答

12

如果您正在寻找“真正”货币格式,类似于通过在SQL Server 2012中启动的FORMAT函数可以实现的功能,那么您可以通过SQLCLR实现完全相同的功能。你可以自己编写简单的.ToString("C" [, optional culture info]),或者你可以下载SQL#库(我写的,但是这个函数是免费版的),并且像T-SQL FORMAT函数一样使用它。

例如:

SELECT SQL#.Math_FormatDecimal(123.456, N'C', N'en-us'); 

输出:

$ 123.46

SELECT SQL#.Math_FormatDecimal(123.456, N'C', N'fr-fr'); 

输出:

123,46€

此方法适用于SQL Server 2005/2008/2008 R2。并且,如果/当您升级到较新版本的SQL Server时,您可以选择仅通过将名称SQL#.Math_FormatDecimal更改为FORMAT来轻松切换到本机T-SQL功能。

把这个进入查询从原来的问题的背景:

SELECT SQL#.Math_FormatDecimal(COALESCE(SUM(SUBTOTAL),0), N'C', N'en-us') AS [Total] 
FROM dbo.SALESORD_HDR 
where ORDERDATE = datediff(d,0,getdate()) 
and STATUS NOT IN (3,6) 

编辑:

OR,因为似乎只有en-us格式是需要的,是有捷径这太容易了:使用CONVERT函数从MONEYSMALLMONEY数据类型转换为en-us减去货币符号的“样式”,但是很容易添加:

SELECT '$' + CONVERT(VARCHAR(50), 
       CONVERT(MONEY, COALESCE(SUM(SUBTOTAL), 0)), 
       1) AS [Total] 
FROM dbo.SALESORD_HDR 
where ORDERDATE = datediff(d,0,getdate()) 
and STATUS NOT IN (3,6) 

由于SUBTOTAL字段的源数据类型为FLOAT,它首先需要被转换到MONEY,然后转换为VARCHAR。但是,可选的“风格”是我比CAST更喜欢CONVERT的原因之一。

+0

好吧,那么如何编写它以适应我的代码呢?如果我把我的查询放在123.456的固定值的位置,它会失败,并说不能在里面嵌套查询。 – Bevan 2014-09-29 02:15:19

+0

@Bevan:它只是一个像COALESCE,SUM等函数。我将更新我的答案,以便在查询的上下文中使用它。 – 2014-09-29 02:19:20

+1

@Bevan:答案已更新为实际使用情况。 – 2014-09-29 02:23:49