Postgres错误:批量更新SQL除以零

时间:2012-01-08 09:49:46

标签: postgresql bulkinsert

我收到此错误:错误:除以零。 SQL状态:22012

以下是我的查询 -

UPDATE USR
SET    PRCNT_SATSFCTN = (SELECT (SELECT COUNT(*) 
             FROM   ORDR 
             WHERE  USR.USR_ID = ORDR.USR_ID AND 
                    STSFD_SW = 'Y') * 100 / COUNT(*) 
                 FROM   ORDR
                     WHERE  USR.USR_ID = ORDR.USR_ID)

2 个答案:

答案 0 :(得分:2)

你可以尝试:

UPDATE usr
SET    prcnt_satsfctn = o.share
FROM  (
    SELECT usr_id
         ,(count(CASE WHEN stsfd_sw = 'Y' THEN 1 ELSE NULL END) * 100)
         / count(*) AS share   -- cannot be NULL!
    FROM   ordr
    GROUP  BY 1
    ) o
WHERE  usr.usr_id = o.usr_id

此查询应该是以多种方式改进的:

  • 更新usrordr中没有匹配行的任何行。那是0分裂发生的地方。 (@ Jan的查询将使用NULL进行更新。)

  • 此处不能发生0分区。

  • 更快,因为它只需要扫描一次表ordr

  • 更短,更清洁。

答案 1 :(得分:1)

正如错误所述。如果您的ORDR计数(*)为零,则计算将失败。也许添加一个额外的检查确保你的除法的右边永远不会为零。

UPDATE USR SET    PRCNT_SATSFCTN = (SELECT (SELECT COUNT(*) 
              FROM   ORDR 
              WHERE  USR.USR_ID = ORDR.USR_ID AND 
                     STSFD_SW = 'Y') * 100 / COUNT(*) 
                  FROM   ORDR
                      WHERE  USR.USR_ID = ORDR.USR_ID 
                      HAVING COUNT(*) > 0)