在 MS SQL 服务器中将数字格式化为百分比
Format number as percent in MS SQL Server
我想简单地将数字格式化为带两位小数的百分比。如果它是 37 除以 38(又名 .973684210526315789),我希望它在 SQL 输出中显示 97.36%。我知道建议在应用程序中进行格式化,但这是为了自动导出。这是使用 SQL Server 2008。
这是我现在拥有的:
select CONVERT(VARCHAR(50),cast(37 as decimal)/cast(38 as decimal)*100)+' %' AS [%]
如果您能解释一下函数中各种参数的含义,那将很有帮助。
在SQL Server 2012及更新版本中,有FORMAT()
功能。您可以向它传递一个 'P'
百分比参数。例如:
SELECT FORMAT((37.0/38.0),'P') as [Percentage] -- 97.37 %
至 support percentage decimal precision,您可以使用 P0
表示无小数(整数)或 P3
表示 3 位小数 (97.368%)。
SELECT FORMAT((37.0/38.0),'P0') as [WholeNumberPercentage] -- 97 %
SELECT FORMAT((37.0/38.0),'P3') as [ThreeDecimalsPercentage] -- 97.368 %
SELECT cast( cast(round(37.0/38.0,2) AS DECIMAL(18,2)) as varchar(100)) + ' %'
RESULT: 0.97 %
并且对于所有 SQL 服务器版本
SELECT CAST(0.973684210526315789 * 100 AS DECIMAL(18, 2))
M.Ali的答案可以修改为
select Cast(Cast((37.0/38.0)*100 as decimal(18,2)) as varchar(5)) + ' %' as Percentage
在新版本的 SQL 服务器中使用 FORMAT 函数更加简单并且允许更多控制:
FORMAT(yournumber, '#,##0.0%')
这样做的好处是您可以控制额外的东西,例如千位分隔符,并且您不会在数字和“%”之间得到 space。
接受挑战来解决这个问题。
第 5 条评论 (M.Ali) 要求 --"The required answer is 97.36 % (not 0.97 %) .."
为此,我附上了一张比较 post 数字 3 (sqluser) 与我的解决方案的照片。 (我在 mac 上使用 postgre_sql)
可能出现的问题是舍入问题。
.973684210526315789*100 -> 97.37 False
.973684210526315789*100 -> 97.36 True
存在两种方法:String Functions
和 Numerical Functions
String Functions
可以避免舍入问题,使用CAST
(等价于CONVERT
)和LEFT
[=等函数32=]
SELECT LEFT(Cast(.973684210526315789*100 AS VARCHAR(100)), 5) + ' %'
SELECT LEFT(CONVERT(VARCHAR(100), .973684210526315789*100), 5) + ' %'
Numerical Functions
可能会带来 舍入问题 ,要避免它,请使用 ROUND
函数
SELECT LEFT(Round(.973684210526315789*100, 2, 1), 5) + ' %'
为了避免使用 LEFT
函数(字符串函数),在转换和转换中使用 DECIMAL(18,2)
和 NUMERIC(18, 2)
。
SELECT Concat(Cast(Round(.973684210526315789 * 100, 2, 1) AS DECIMAL(18, 2)),' %')
SELECT Concat(CONVERT(NUMERIC(10, 2), Round(.973684210526315789 * 100, 2, 1)),' %')
另外你可以使用FORMAT
、###.##
和00.00
类似于整数部分和小数部分 和 ###.##
应该优先于 00.00
因为它可以避免零值
SELECT FORMAT(Round(.973684210526315789*100, 2, 1), '######.#####')+ ' %' ---> 97.36%
SELECT FORMAT(Round(.973684210526315789*100, 2, 1), '00000.0000')+ ' %' ---> 00097.3600%
SELECT FORMAT(Round(.973684210526315789*100, 2, 1), '00.00')+ ' %' ---> 97.36%
我想简单地将数字格式化为带两位小数的百分比。如果它是 37 除以 38(又名 .973684210526315789),我希望它在 SQL 输出中显示 97.36%。我知道建议在应用程序中进行格式化,但这是为了自动导出。这是使用 SQL Server 2008。
这是我现在拥有的:
select CONVERT(VARCHAR(50),cast(37 as decimal)/cast(38 as decimal)*100)+' %' AS [%]
如果您能解释一下函数中各种参数的含义,那将很有帮助。
在SQL Server 2012及更新版本中,有FORMAT()
功能。您可以向它传递一个 'P'
百分比参数。例如:
SELECT FORMAT((37.0/38.0),'P') as [Percentage] -- 97.37 %
至 support percentage decimal precision,您可以使用 P0
表示无小数(整数)或 P3
表示 3 位小数 (97.368%)。
SELECT FORMAT((37.0/38.0),'P0') as [WholeNumberPercentage] -- 97 %
SELECT FORMAT((37.0/38.0),'P3') as [ThreeDecimalsPercentage] -- 97.368 %
SELECT cast( cast(round(37.0/38.0,2) AS DECIMAL(18,2)) as varchar(100)) + ' %'
RESULT: 0.97 %
并且对于所有 SQL 服务器版本
SELECT CAST(0.973684210526315789 * 100 AS DECIMAL(18, 2))
M.Ali的答案可以修改为
select Cast(Cast((37.0/38.0)*100 as decimal(18,2)) as varchar(5)) + ' %' as Percentage
在新版本的 SQL 服务器中使用 FORMAT 函数更加简单并且允许更多控制:
FORMAT(yournumber, '#,##0.0%')
这样做的好处是您可以控制额外的东西,例如千位分隔符,并且您不会在数字和“%”之间得到 space。
接受挑战来解决这个问题。 第 5 条评论 (M.Ali) 要求 --"The required answer is 97.36 % (not 0.97 %) .." 为此,我附上了一张比较 post 数字 3 (sqluser) 与我的解决方案的照片。 (我在 mac 上使用 postgre_sql)
可能出现的问题是舍入问题。
.973684210526315789*100 -> 97.37 False
.973684210526315789*100 -> 97.36 True
存在两种方法:String Functions
和 Numerical Functions
String Functions
可以避免舍入问题,使用CAST
(等价于CONVERT
)和LEFT
[=等函数32=]
SELECT LEFT(Cast(.973684210526315789*100 AS VARCHAR(100)), 5) + ' %'
SELECT LEFT(CONVERT(VARCHAR(100), .973684210526315789*100), 5) + ' %'
Numerical Functions
可能会带来 舍入问题 ,要避免它,请使用 ROUND
函数
SELECT LEFT(Round(.973684210526315789*100, 2, 1), 5) + ' %'
为了避免使用 LEFT
函数(字符串函数),在转换和转换中使用 DECIMAL(18,2)
和 NUMERIC(18, 2)
。
SELECT Concat(Cast(Round(.973684210526315789 * 100, 2, 1) AS DECIMAL(18, 2)),' %')
SELECT Concat(CONVERT(NUMERIC(10, 2), Round(.973684210526315789 * 100, 2, 1)),' %')
另外你可以使用FORMAT
、###.##
和00.00
类似于整数部分和小数部分 和 ###.##
应该优先于 00.00
因为它可以避免零值
SELECT FORMAT(Round(.973684210526315789*100, 2, 1), '######.#####')+ ' %' ---> 97.36%
SELECT FORMAT(Round(.973684210526315789*100, 2, 1), '00000.0000')+ ' %' ---> 00097.3600%
SELECT FORMAT(Round(.973684210526315789*100, 2, 1), '00.00')+ ' %' ---> 97.36%