DB2 SQL如何将数字转换为字符串然后将百分号连接到它上?

时间:2015-01-20 19:20:08

标签: sql db2

我想在我的结果字段中显示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)

如果有人能指出我正确的方向,我真的很感激。

3 个答案:

答案 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'
) || '%'