【问题标题】:Casting as decimal not acting as expected转换为十进制未按预期进行
【发布时间】:2016-11-30 15:34:20
【问题描述】:

我是 SQL 新手,我正在尝试从两个预先计算的数字中计算百分比。我希望百分比为小数点后 2 位。这些数字是整数,所以我在百分比计算之前将它们转换为小数。计算很简单

(Risk1/GrandTotal *100) 都来自同一张表。

下面给出一段代码:

SELECT risk_date_day,
       ((CAST(Risk1 as decimal(38,2))/CAST(GrandTotal as decimal(38,2))) * 100) FROM DPRAT2_Export

The result shows 6 numbers after the decimal

我已经为十进制(x,x)的参数尝试了许多不同的数字。我从研究中了解到,第二个数字是比例,它指定小数点后的位数。我不确定为什么结果有 6 个小数位。请帮忙。谢谢!

【问题讨论】:

  • 请用您正在使用的数据库标记您的问题。

标签: sql casting decimal


【解决方案1】:

cast()之后除法:

SELECT risk_date_day,
       CAST(Risk1 * 100.0 / GrandTotal as decimal(38, 2))
FROM DPRAT2_Export;

一般的 SQL,尤其是 SQL Server 具有非常神秘的规则,用于确定小数数学运算结果中的小数点数。所以,只需转换结果。

如果存在GrandTotal 可能为零的风险,我会建议:

SELECT risk_date_day,
       CAST(Risk1 * 100.0 / NULLIF(GrandTotal, 0) as decimal(38, 2))
FROM DPRAT2_Export;

这可以防止被零除错误,而是返回NULL

【讨论】:

  • 两种方法只给我百分比的四舍五入值,小数点后跟 2 个零。例如。 18.00, 7.00..... 但是当我使用 UPDATE 在另一个表中输入值时,我之前的代码似乎工作了。当我使用 SELECT 显示它时它不起作用。奇怪...
  • @FariyaFarhad 。 . .一些数据库进行整数除法。如果您使用其中一个数据库,则只需乘以 100.0 而不是 100。这就是您应该正确标记问题的原因。
猜你喜欢
  • 1970-01-01
  • 2018-09-04
  • 2011-07-28
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多