mat*_*mc3 183 t-sql sql-server
我正在运行一些管理查询并sp_spaceused在SQL Server 2008中编译结果,以查看数据库中某些表的数据/索引空间比率.当然,我在结果中得到了各种各样的大数字,我的眼睛开始变得光彩照人.如果我可以用逗号格式化所有这些数字将非常方便(987654321变为987,654,321).有趣的是,在我使用SQL Server的这么多年里,这个问题从来没有出现,因为大多数时候我会在表示层进行格式化,但在这种情况下,SSMS中的T-SQL结果就是表示.
我只考虑创建一个简单的CLR UDF来解决这个问题,但看起来这应该只是普通的旧T-SQL.那么,我将在这里提出问题 - 你如何在vanilla T-SQL中进行数字格式化?
Phi*_*unt 251
虽然我同意所有人,包括OP,他们说格式化应该在表示层中完成,但是这种格式化可以通过转换money然后转换为T-SQL来完成varchar.这确实包括尾随小数,但可以循环使用SUBSTRING.
SELECT CONVERT(varchar, CAST(987654321 AS money), 1)
Run Code Online (Sandbox Code Playgroud)
Tho*_*ler 150
在SQL Server 2012及更高版本中,这将使用逗号格式化数字:
select format([Number], 'N0')
Run Code Online (Sandbox Code Playgroud)
您还可以更改0为所需的小数位数.
zom*_*omf 58
我建议使用Replace代替Substring以避免字符串长度问题:
REPLACE(CONVERT(varchar(20), (CAST(SUM(table.value) AS money)), 1), '.00', '')
Run Code Online (Sandbox Code Playgroud)
bil*_*nkc 47
对于SQL Server 2012+实现,您将能够使用FORMAT将字符串格式应用于非字符串数据类型.
在最初的问题中,用户已经请求使用逗号作为千位分隔符.在一个封闭的重复问题中,用户询问他们如何应用货币格式.以下查询显示了如何执行这两个任务.它还演示了文化的应用,使其成为一种更通用的解决方案(解决了Tsiridis Dimitris应用希腊语特殊格式的功能)
-- 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);
Run Code Online (Sandbox Code Playgroud)
SQLFiddle为上述
Con*_*ngo 20
演示添加逗号:
PRINT FORMATMESSAGE('The number is: %s', format(5000000, '#,##0'))
-- Output
The number is: 5,000,000
Run Code Online (Sandbox Code Playgroud)
演示逗号和小数点.如有必要,请注意它会舍入最后一位数字.
PRINT FORMATMESSAGE('The number is: %s', format(5000000.759145678, '#,##0.00'))
-- Output
The number is: 5,000,000.76
Run Code Online (Sandbox Code Playgroud)
SQL Server 2012+.
SELECT REPLACE(CONVERT(varchar(20), (CAST(9876543 AS money)), 1), '.00', '')
Run Code Online (Sandbox Code Playgroud)
输出= 9,876,543
您可以用列名替换9876543.
小智 9
请尝试以下查询:
SELECT FORMAT(987654321,'#,###,##0')
Run Code Online (Sandbox Code Playgroud)
右小数点格式:
SELECT FORMAT(987654321,'#,###,##0.###\,###')
Run Code Online (Sandbox Code Playgroud)
小智 7
尝试上面的金钱技巧,这适用于具有两个或更少有效数字的数值.我创建了自己的函数来格式化带小数的数字:
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
Run Code Online (Sandbox Code Playgroud)
小智 5
这属于对Phil Hunt的回答的评论,但可惜我没有代表。
要去除数字字符串末尾的“.00”, parsename 非常方便。它对以句点分隔的字符串进行标记并返回指定的元素,从最右边的标记作为元素 1 开始。
SELECT PARSENAME(CONVERT(varchar, CAST(987654321 AS money), 1), 2)
Run Code Online (Sandbox Code Playgroud)
产量“987,654,321”