使用千位分隔符格式化 COUNT 结果的更简洁方法?

Posted

技术标签:

【中文标题】使用千位分隔符格式化 COUNT 结果的更简洁方法?【英文标题】:A more concise way to format COUNT result with thousands separator? 【发布时间】:2013-08-18 00:46:37 【问题描述】:

目标

在简洁的语句中将COUNT 结果格式化为通用格式(例如###,##0),并且不使用UDF。

我试过了

我目前正在使用这样的东西,虽然它留下了两位小数并且很笨重:

SELECT CONVERT(VARCHAR, CAST(COUNT([id]) AS MONEY), 1) FROM tbl

我选择这个方向的原因是因为它是我在阅读 MSDN 的 CAST and CONVERT 文档时能找到的唯一标准格式选项。

我不是很喜欢它,但它会一瘸一拐地走,因为这些数字只是在 T-SQL 运行后被复制并粘贴到其他文本编辑器等中。当然,它们必须手动格式化以删除某些地方的小数。

研究和限制

当然,您可以构建一个用户定义的函数,例如 one on this blog,但我有一个限制,无法为此构建 UDF。

经过一些额外的研究,我发现如果我使用的是 SQL 2012,我可以使用新的 T-SQL FORMAT 函数,唉,我仅限于 2008 R2。这当然利用了不同的平台,因为它是一个 .NET 接口。 :D

我也知道这个解决方案:Format a number with commas but without decimals in SQL Server 2008 R2?

【问题讨论】:

我相信你已经意识到了这一点,我不想质疑任何有这么多代表的人,但这确实在你的所以中更容易处理应用程序,除非您绝对一心想在 SQL 查询中执行此操作 为什么不在客户端执行这种格式化,例如C# 在 Format() 和 ToString() 中有很好的功能。还有please stop declaring varchar without length. It's lazy and dangerous. @LittleBobbyTables,在这种情况下我仅限于T-SQL。正如您所说,如果我有钱的话,我会在 .NET 中执行此操作。但是,这是一个庞大的转换脚本,由于我无法控制的限制,必须在 SQL 服务器上执行。 @AaronBertrand,在这种情况下我只能使用T-SQL。当然,我很想在这里利用 .NET 框架让我的生活更轻松一些。如果我可以使用 .NET 进行整个转换,我会的,但可惜我受到了权力的限制。 那么现有的解决方案有什么问题呢?你想要更简洁的东西吗?更高效?还有什么?如果它没有损坏,我认为除了在客户端上进行格式化之外,您不会找到任何“更好”的东西。 【参考方案1】:

即使问题作者被困在 SQL Server 2008R2 上,如果您有幸使用 SQL Server 2012 或更新版本,这也是一个简洁高效的解决方案。

小数点后无数字(四舍五入)

SELECT FORMAT(COUNT([id]), N'N0')
FROM [tbl]

示例输出

53,234,568

小数点后一位

SELECT FORMAT(COUNT([id]), N'N1')
FROM [tbl]

示例输出

53,234,567.9

小数点后两位

SELECT FORMAT(COUNT([id]), N'N2')
FROM [tbl]

示例输出

53,234,567.89

(等等)

小数点后两位,无千位分隔符

SELECT FORMAT(COUNT([id]), N'#.00')
FROM [tbl]

示例输出

53234567.89

【讨论】:

这应该是答案。 这是最好的答案!【参考方案2】:

不是最优雅的,但您可以使用替换删除尾随的 .00。

SELECT REPLACE(CONVERT(VARCHAR, CAST(COUNT([id]) AS MONEY), 1), '.00', '')
FROM tbl

【讨论】:

+1,我最初的想法是使用LEFT(zzz,len(zzz)-3),但是这个接缝更好

以上是关于使用千位分隔符格式化 COUNT 结果的更简洁方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何获得顶部带有千位分隔符的数字?

在 Swift 中向 Int 添加千位分隔符

PHP字符串函数 number_format(以千位分隔符方式格式化一个数字)

将 y 轴标签格式化为具有许多零的更高千位科学记数法?

Javascript千位分隔符/字符串格式[重复]

JS从入门到放弃,千位分隔符