SQL Server 2008: как форматировать вывод в виде валюты

У меня есть строка запроса, которая возвращает значение, имеющее несколько десятичных знаков. Я хочу отформатировать это в валюте $123.45.

Вот запрос:

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

Я хочу получить результат в валюте с двумя десятичными знаками.

Ответ 1

Если вы ищете "истинный" формат валюты, подобный тому, что может быть достигнуто с помощью функции FORMAT, которая была запущена в SQL Server 2012, то вы можете достичь точно такой же функциональности через SQLCLR. Вы можете либо .ToString("C" [, optional culture info]) кодировать простой .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, у вас есть возможность легко переключиться на встроенную функцию T-SQL, не делая ничего, кроме как изменить имя SQL#.Math_FormatDecimal на просто FORMAT.

Поместив это в контекст запроса из исходного вопроса:

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)

РЕДАКТИРОВАТЬ:

ИЛИ, так как кажется, что только en-us формат желателен, есть укороченное это слишком просто: Преобразование либо MONEY или SMALLMONEY типов данных с помощью CONVERT функции есть "стиль" для 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. Но необязательный "стиль" - одна из причин, по которой я предпочитаю CONVERT CAST.

Ответ 2

Здесь предложение синтаксиса, чтобы использовать для будущего поискового запроса.

select format(123.56789,'C2','en-US')  --$123.57 ;
select format(123.56789,'C3','en-US') --$123.568;
select format(123.56789,'C0','en-US') --$124