2012-11-15 37 views
1

我需要一些有關sql轉換的幫助。這是我一直在提供查詢的一部分:將數字格式化爲包含分隔符的貨幣值

'$' + replace(cast((CAST(p.Price1 AS decimal(10,2)) * cast(isnull(p.Multiplier,1) as decimal(10,2))) as varchar), '.0000', '') 

基本上,它最終是一個varchar,看起來像這樣:$26980

我需要在一千萬元大關插入一個逗號(如果適用)。所以在這種情況下,$26,980

什麼是最簡單的方法來做到這一點,而不必重寫整個事情?

+2

你爲什麼要在服務器端執行此操作?在你的應用程序中執行這種格式會容易得多。 – Taryn

+1

東西http://msdn.microsoft.com/en-us/library/ms188043.aspx – Paparazzi

+0

無論如何,如果(當?)必須支持歐洲或亞洲的貨幣時,您必須重新編寫它,格式化規則完全不同。正如bluefeet所建議的那樣,最好在客戶端應用程序中執行此操作,您可以簡單地使用現有的本地化功能而不是自己執行此操作(C#格式化可以[執行此操作](http://msdn.microsoft.com例如)/en-us/library/dwhawy9k(v=vs.100).aspx)。 – Pondlife

回答

1

在客戶端進行。話雖如此,這個例子應該告訴你方式。

with p(price1, multiplier) as (select 1234.5, 10) 
select '$' + replace(cast((CAST(p.Price1 AS decimal(10,2)) * cast(isnull(p.Multiplier,1) as decimal(10,2))) as varchar), '.0000', ''), 
     '$' + parsename(convert(varchar,cast(p.price1*isnull(p.Multiplier,1) as money),1),2) 
from p 

的關鍵是在最後表達

'$' + parsename(convert(varchar,cast(p.price1*isnull(p.Multiplier,1) as money),1),2) 

注:如果p.price1是不是十進制(10,2)精度更高,那麼你可能要投它的表達以及由於原來的CAST(p.Priced1 as decimal(10,2))將進行四捨五入,以產生忠實的翻譯。

+0

這工作,謝謝 – optionsix

1

如果你真的必須在TSQL做到這一點,你可以使用CONVERT(),但這樣的事情確實不屬於數據庫:

declare @m money = 12345678 
-- with decimal places 
select '$' + convert(varchar, @m, 1) 
-- without decimal places 
select '$' + replace(convert(varchar, @m, 1), '.00', '') 
0

你可以把它變成一個功能,那就只50人物回來。

DECLARE @input VARCHAR(50) 
SELECT @input = '123123123.00' 
SELECT @input = CASE WHEN CHARINDEX('.', @input) > offset +1 
         THEN STUFF(@input, CHARINDEX('.', @input) - offset, 0, ',') 
         ELSE @input END 
FROM (SELECT 3 offset UNION SELECT 7 UNION SELECT 12 UNION SELECT 18 UNION SELECT 25 UNION SELECT 33 UNION SELECT 42) b 
PRINT @input 

對於每個位置偏移量都增加+1,因爲它假定您已經爲前面的位置插入了逗號。