Как мне отформатировать число с запятыми в T-SQL? - PullRequest
168 голосов
/ 07 декабря 2010

Я выполняю несколько административных запросов и компилирую результаты из sp_spaceused в SQL Server 2008, чтобы посмотреть на соотношение данных / пространства индексов некоторых таблиц в моей базе данных.Конечно, я получаю много разных результатов, и мои глаза начинают затуманиваться.Было бы очень удобно, если бы я мог отформатировать все эти числа запятыми (987654321 становится 987,654,321).Забавно, что за все те годы, когда я использовал SQL Server, эта проблема никогда не возникала, поскольку большую часть времени я занимался форматированием на уровне представления, но в этом случае результат T-SQL в SSMS равен презентация.

Я решил просто создать простой CLR UDF, чтобы решить эту проблему, но кажется, что это должно быть выполнимо в простом старом T-SQL.Итак, я задам вопрос здесь - как вы делаете числовое форматирование в vanilla T-SQL?

Ответы [ 14 ]

246 голосов
/ 07 декабря 2010

Хотя я согласен со всеми, включая OP, который говорит, что форматирование должно выполняться на уровне представления, это форматирование можно выполнить в T-SQL, приведя к money и затем преобразовав в varchar. Это включает в себя конечные десятичные дроби, которые могут быть зациклены с SUBSTRING.

SELECT CONVERT(varchar, CAST(987654321 AS money), 1)
121 голосов
/ 25 сентября 2015

В SQL Server 2012 и выше, это будет форматировать число с запятыми:

select format([Number], 'N0')

Вы также можете изменить 0 на желаемое количество десятичных разрядов.

58 голосов
/ 24 сентября 2011

Я бы порекомендовал заменить вместо подстроки, чтобы избежать проблем с длиной строки:

REPLACE(CONVERT(varchar(20), (CAST(SUM(table.value) AS money)), 1), '.00', '')
46 голосов
/ 16 апреля 2013

Для реализаций SQL Server 2012+ у вас будет возможность использовать FORMAT для применения форматирования строки к нестроковым типам данных.

В исходном вопросе пользователь запросил возможность использовать запятые в качестве разделителей тысяч. В , закрытом как дублирующий вопрос , пользователь спросил, как они могут применять форматирование валюты. Следующий запрос показывает, как выполнить обе задачи. Это также демонстрирует применение культуры, чтобы сделать это более универсальное решение (обращаясь к функции Циридиса Димитриса для применения специального греческого форматирования)

-- FORMAT
-- http://msdn.microsoft.com/en-us/library/hh213505(v=sql.110).aspx
-- FORMAT does not do conversion, that's the domain of cast/convert/parse etc
-- Only accepts numeric and date/time data types for formatting. 
--
-- Formatting Types
-- http://msdn.microsoft.com/en-us/library/26etazsy.aspx

-- Standard numeric format strings
-- http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
SELECT
    -- c => currency
    -- n => numeric
    FORMAT(987654321, N'N', C.culture) AS some_number
,   FORMAT(987654321, N'c', C.culture) AS some_currency
,   C.culture
FROM
    (
        -- Language culture names
        -- http://msdn.microsoft.com/en-us/library/ee825488(v=cs.20).aspx
        VALUES
            ('en-US')
        ,   ('en-GB')
        ,   ('ja-JP')
        ,   ('Ro-RO')
        ,   ('el-GR')
    ) C (culture);

SQLFiddle для вышеупомянутого

20 голосов
/ 31 марта 2016

Демо 1

Демонстрирует добавление запятых:

PRINT FORMATMESSAGE('The number is: %s', format(5000000, '#,##0'))
-- Output
The number is: 5,000,000

Демо 2

Демонстрирует запятые и десятичные точки. Обратите внимание, что при необходимости округляется последняя цифра.

PRINT FORMATMESSAGE('The number is: %s', format(5000000.759145678, '#,##0.00'))
-- Output
The number is: 5,000,000.76

Совместимость

SQL Server 2012+.

9 голосов
/ 17 августа 2016
SELECT REPLACE(CONVERT(varchar(20), (CAST(9876543 AS money)), 1), '.00', '')

выход = 9 876 543

и вы можете заменить 9876543 именем вашего столбца.

8 голосов
/ 30 марта 2018

Пожалуйста, попробуйте следующий запрос:

SELECT FORMAT(987654321,'#,###,##0')

Формат с правой десятичной точкой:

SELECT FORMAT(987654321,'#,###,##0.###\,###')
7 голосов
/ 25 июля 2011

Пробовал денежный трюк выше, и это прекрасно работает для числовых значений с двумя или менее значащими цифрами.Я создал свою собственную функцию для форматирования чисел с десятичными знаками:

CREATE FUNCTION [dbo].[fn_FormatWithCommas] 
(
    -- Add the parameters for the function here
    @value varchar(50)
)
RETURNS varchar(50)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @WholeNumber varchar(50) = NULL, @Decimal varchar(10) = '', @CharIndex int = charindex('.', @value)

    IF (@CharIndex > 0)
        SELECT @WholeNumber = SUBSTRING(@value, 1, @CharIndex-1), @Decimal = SUBSTRING(@value, @CharIndex, LEN(@value))
    ELSE
        SET @WholeNumber = @value

    IF(LEN(@WholeNumber) > 3)
        SET @WholeNumber = dbo.fn_FormatWithCommas(SUBSTRING(@WholeNumber, 1, LEN(@WholeNumber)-3)) + ',' + RIGHT(@WholeNumber, 3)



    -- Return the result of the function
    RETURN @WholeNumber + @Decimal

END
4 голосов
/ 07 ноября 2017

Это относится к комментарию к ответу Phil Hunt , но, увы, у меня нет представителя.

Чтобы удалить ".00" с конца вашей числовой строки, parsename супер удобен.Он токенизирует строки, разделенные точками, и возвращает указанный элемент, начиная с самого правого токена как элемента 1.

SELECT PARSENAME(CONVERT(varchar, CAST(987654321 AS money), 1), 2)

Получает "987,654,321"

3 голосов
/ 06 сентября 2012

вот еще т-sql UDF

CREATE FUNCTION dbo.Format(@num int)
returns varChar(30)
As
Begin
Declare @out varChar(30) = ''

  while @num > 0 Begin
      Set @out = str(@num % 1000, 3, 0) + Coalesce(','+@out, '')
      Set @num = @num / 1000
  End
  Return @out
End
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...