【问题标题】:SQL - Why I need to cast as decimal?SQL - 为什么我需要转换为十进制?
【发布时间】:2019-07-26 09:00:52
【问题描述】:

当我必须总结并除以 100 时,我正在做一个 SQL 练习。我得到了我想要的(变量 TOTAL_AMT),但我想更好地理解为什么 TOTAL_AMT1 不正确:

在TOTAL_AMT像0.1这样小的输出中,TOTAL_AMT1只带0.0。这是为什么呢?

'SELECT
Extract (YEAR From CREATED_AT) AS YEAR_NO
,Extract (MONTH From CREATED_AT) AS MONTH_NO
,CURRENCY_ID
,  Cast((Sum(AMOUNT )/100) AS DECIMAL(6,1)) AS TOTAL_AMT1
,(Sum(Cast(AMOUNT AS DECIMAL(6,1)))/100) AS TOTAL_AMT
FROM DDEWA03P.DW36991_SALES
GROUP BY  1,2,3
ORDER BY YEAR_NO,MONTH_NO,CURRENCY_ID ASC;'

谢谢!

【问题讨论】:

  • 换个顺序,CAST(SUM(AMOUNT) as DECIMAL(6,1)) / 100
  • 因为整数/整数只返回结果的整数部分。
  • 感谢@jarlh。这也有效。我的问题是为什么 TOTAL_AMT1 方式不会给出正确的数字。是关于变量类型的吗?
  • 正如我所说,当您进行整数除法时,小数部分会丢失。你也必须强制小数除法才能得到小数。
  • 谢谢!!男人! :) 回答

标签: sql teradata decimalformat variable-types


【解决方案1】:

这是由于舍入错误。考虑以下几点:

select cast(sum(amount) as decimal(6,1))
from (values (0.04), (0.04), (0.04)) example(amount)

上面将 0.04、0.04 和 0.04 相加得到 0.12,然后将其转换为 0.1。

现在考虑一下:

select sum(cast(amount as decimal(6,1)))
from ( values (0.04), (0.04), (0.04) ) example(amount)

这会将 0.04、0.04 和 0.04 转换为 0.0、0.0、0.0 并将它们相加得到 0.0。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    如果你先将其转换为小数,我认为金额太小,所有的总和将比总和非常小,然后将其转换为小数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 2016-11-12
      • 2015-05-02
      • 2011-07-02
      • 1970-01-01
      • 2019-08-31
      相关资源
      最近更新 更多