在SQL中向表中添加列时对公式的正确答案

时间:2018-12-23 19:05:17

标签: sql postgresql

我的桌子看起来像这样:

     error |  num  |    date    
    -------+-------+------------
       274 | 38431 | 2016-07-01
       389 | 54811 | 2016-07-02
       401 | 54465 | 2016-07-03

我想计算“错误”在哪个日期超过“数字”的1%。

目前,我正在尝试使用以下表达式执行此操作:

select date, error, num, (100 * (error / num)) as percentage 
from DD 
limit 3;

我得到的结果不正确:

        date    | error |  num  | percentage 
    ------------+-------+-------+------------
     2016-07-01 |   274 | 38431 |          0
     2016-07-02 |   389 | 54811 |          0
     2016-07-03 |   401 | 54465 |          0

如果我取出100 *,也会得到同样的错误结果。

使用以下解决方案,

    select DD.*, (100.0 * error/num) as percentage from DD where (100.0 * error /num) > 1.0 

我得到正确的第一行,但其余的不正确:

     error |  num  |    date    |      percentage      
    -------+-------+------------+----------------------
    1265 | 54642 | 2016-07-17 |   2.3150689945463197
     274 |   274 | 2016-07-01 | 100.0000000000000000
     389 |   389 | 2016-07-02 | 100.0000000000000000

我检查了日期2016-07-01,它有274错误,但数字高得多。为什么它对第一行有效,但对其余行却无效?

2 个答案:

答案 0 :(得分:4)

使用100.0而不是100来避免整数除法:

select dd.*, (100.0 * error / num) as percentage
from dd
where (100.0 * error / num) > 1.0;

答案 1 :(得分:1)

我认为您只需要带有算术运算的where子句:

select dd.*
from dd
where error > num / 100;

如果需要百分比,请注意整数除法

(error * 100.0 / num)