我想在我的结果字段中显示71%。我先将小数百分比四舍五入(它是71.04),现在我想把它变成一个字符串,以便我可以连接'%'在它上面。这应该很简单,但我搜索和尝试的所有内容都失败了。以下是我尝试过的两个最有希望的版本以及每个版本的结果:
CHAR
(
ROUND
(
(COUNT(ONTIMETOPDD) * 100.0) /
(
SELECT COUNT(ONTIMETOPDD)
FROM WG4
WHERE APPLICABLEDELIVCOLUMN <> 'NO DELIVERY DATE'
)
,0)
)
|| '%'
AS RESULTS
结果:没有错误消息,只是一个空白字段。我也用连接线注释掉了这个。这让我在列右侧的数字71合理,这让我相信它没有被转换为字符串。
CAST
(
ROUND
(
(COUNT(ONTIMETOPDD) * 100.0) /
(
SELECT COUNT(ONTIMETOPDD)
FROM WG4
WHERE APPLICABLEDELIVCOLUMN <> 'NO DELIVERY DATE'
)
,0)
AS CHAR)
|| '%'
AS RESULTS
结果:错误消息SQL0433 - 在CAST到字符期间截断的重要数据。 (#-433)
如果有人能指出我正确的方向,我真的很感激。
答案 0 :(得分:0)
在转换为字符列之前,百分比是DECIMAL
类型,因此请先尝试将其转换为SMALLINT
,以便除去小数点。之后,转换为VARCHAR
而不是CHAR
将消除0到99之间值的尾随空格。
LTRIM
(
CAST
(
SMALLINT
(
ROUND
(
(COUNT(ONTIMETOPDD) * 100.0) /
(
SELECT COUNT(ONTIMETOPDD)
FROM WG4
WHERE APPLICABLEDELIVCOLUMN <> 'NO DELIVERY DATE'
)
,0)
)
AS VARCHAR(4)
)
)
|| '%'
AS RESULTS
答案 1 :(得分:0)
CHAR是固定长度的字符值。其中包括领先/尾随空白。
鉴于您要连接%符号的内容,VARCHAR将是更好的选择。
ROUND()不会更改被舍入的数字的比例,它只会使相应的数字为零。
因此,如果您真的想要使用round,那么在转换为VARCHAR之前,您需要使用另一个函数将值的比例更改为0。 INT()是我个人的最爱。
select .7184, varchar(int(round(.7184, 2) * 100)) concat '%'
from sysibm.sysdummy1
如果您可以使用简单截断,则可以使用INT()而不进行舍入。
select .7184, varchar(int(.7184 * 100)) concat '%'
from sysibm.sysdummy1
答案 2 :(得分:0)
我更喜欢在所有情况下使用TO_CHAR():
TO_CHAR(
(SELECT COUNT(ONTIMETOPDD)
FROM WG4
WHERE APPLICABLEDELIVCOLUMN <> 'NO DELIVERY DATE'
),
'99'
) || '%'