Ошибка Postgres: деление на ноль при массовом обновлении SQL - PullRequest
0 голосов
/ 08 января 2012

Я получаю эту ошибку: ОШИБКА: деление на ноль.Состояние 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 ]

2 голосов
/ 08 января 2012

Вы можете попробовать:

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

Этот запрос должен быть улучшен несколькими способами:

  • Обновляет ли не какую-либо строку вusr, где в ordr нет соответствующей строки.Вот где происходит деление на 0.(Запрос @ Jan будет обновляться с NULL вместо этого.)

  • Здесь не может произойти деление на 0.

  • Быстрее, потому что нужно толькоотсканируйте таблицу ordr один раз.

  • Короче, чище.

1 голос
/ 08 января 2012

Как гласит ошибка.Расчет не удастся, если ваш счет 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...