使用SQL查询删除十进制

时间:2016-08-22 01:13:41

标签: sql sql-server

我想将百分比SQL查询结果转换为百分比。示例我有一个0.295333我希望它是30%,如果我有一个0.090036我希望它是9%。

这是我到目前为止所做的。

@Autowired Jaxb2Marshaller marshaller;

@Bean
public MarshallingMessageConverter marshallingMessageConverter() {
    return new MarshallingMessageConverter(marshaller);
}

我也试过这个,但问题是" .00" 的结果,我不知道如何删除小数。

(100 * (sample1/ sample2) ) as 'Percent'

3 个答案:

答案 0 :(得分:1)

因为有些评论指出,如果您从小数点开始的一个或两个原始列都是整数,则可能需要注意您的数据类型。

处理这种情况的一种简单方法是这样的:

ColA * ColB * 1.0这将确保您的整数被视为小数

因此,如果你有SQL Server 2012+,你可以使用格式而不是乱七八糟。就像这个FORMAT(YourDecimal,'#%')一样简单。

;WITH cteValues AS (
    SELECT  0.295333 as OriginalValue
    UNION ALL
    SELECT 0.090036 as OriginalValue
)

SELECT
    OriginalValue
    ,FORMAT(OriginalValue,'#%') as PercentFormat
FROm
    cteValues

如果您是2012年之前并且没有格式,那么简单的方法是将100舍入到100,然后转换为100并转换为int CAST(ROUND(YourDecimal,2) * 100 AS INT)

;WITH cteValues AS (
    SELECT  0.295333 as OriginalValue
    UNION ALL
    SELECT 0.090036 as OriginalValue
)

SELECT
    OriginalValue
    ,CAST(ROUND(OriginalValue,2) * 100 AS INT) as PercentInt
FROm
    cteValues

因为INT根据定义不能有小数位,如果您使用与此类似的方法或您尝试过的方法接收.00,我会问以下内容。

  • 您是否正在组合(乘以等)铸造后的值与另一列或可能是十进制,数字或浮动的值?
  • 您是否在SSMS之外的程序中查看可能自动格式化结果的查询结果,例如Excel,Access?

答案 1 :(得分:1)

尝试使用以下脚本..

cast (100 * Round((sample1 / sample2),2) As int ) as 'Percent'

答案 2 :(得分:1)

  • 首先解决您的假设。

ROUND如何运作?它是否保证返回值,如果是,如何保证?这两列的优先级是什么? Arithmetic operators会影响结果吗?

我只知道我不知道的事情,任何疑问都值得调查。

  • 股息运营商

由于ROUND始终返回更高的优先级,因此这不是问题。事实上,除法运算符(/)可能会将您的值转换为整数。

如果不确定或无法保证(例如格式不足,请CAST而不是必需DECIMAL(4,2)),请始终验证变量是否始终为一种数据类型或DECIMAL(5,3)

DECLARE @Sample1 INT
                , @Sample2 DECIMAL(4,2);
SET @Sample1 = 50;
SET @Sample2 =83.11;

SELECT ROUND( 100 * @Sample1 / @Sample2 , 0 )

正确退货60。

SELECT ROUND( 100 * @Sample2 / @Sample1 , 0)

在舍入之前错误地将变量转换为整数。

  • 原因是SQL中的DIVIDE - MSDN可能返回更高的优先级,但任何整数的被除数都会返回另一个整数。

<强>更新 这也解释了为什么小数在ROUND之后仍然存在...它具有更高的优先级。您可以添加另一个强制转换,以将非INT数据类型转换为首选格式。

SELECT CAST( ROUND( <expression>, <Length>) AS INT)

请注意,在回答您的问题时,我自己学到了一些东西! :)

希望这有帮助。