2014-09-29 117 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