【问题标题】:SQL 'incorrect' calculation of a column [duplicate]SQL“不正确”的列计算[重复]
【发布时间】:2021-09-12 17:01:49
【问题描述】:

我有一个计算列,它给我的结果与使用其他列的手动计算不同。

SELECT  VG.avg_tax, 
        VP2.prop * (S.points / 100) / (NULLIF(CAST(VG.avg_tax AS DECIMAL(7 , 2)) , 0)) AS net_points,
        VP2.prop ,
        S.points,
        (NULLIF(CAST(VG.avg_tax AS DECIMAL(7 , 2)) , 0)) AS divisio ,
        VP2.new_tax

这是代码的第一部分,我认为是错误所在。

结果是:

+---------+------------+------+--------+----------+----------+
| avg_tax | net_points | prop | points |  divisio |  new_tax |
+---------+------------+------+--------+----------+----------+
|    1.23 |  43.902439 |    1 |   5442 |     1.23 |       23 |
+---------+------------+------+--------+----------+----------+

如您所见,通过手工计算,net_points 处的结果应为: 5442/100 * 1 / 1.23 = 44.2439。

为什么会这样?

【问题讨论】:

    标签: sql calculated-columns sqldatatypes


    【解决方案1】:

    我不明白为什么会发生这种情况,但是 S.points 是一个整数会改变 S.points / 100 的结果。

    用 CAST(S.points AS DECIMAL(7 , 2)) 代替 S.points 使结果正确。

    【讨论】:

      【解决方案2】:

      您不指定数据库或数据类型,但某些数据库会进行整数除法。作为一种习惯,我通常在常量中包含小数点以确保:

          VP2.prop * (S.points / 100.0) / (NULLIF(CAST(VG.avg_tax AS DECIMAL(7 , 2)) , 0)) AS net_points,
      

      【讨论】:

        猜你喜欢
        • 2018-08-27
        • 2014-08-28
        • 2020-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-07
        • 1970-01-01
        相关资源
        最近更新 更多