2016-12-12 3 views
0

Я пытаюсь получить% скидки между двумя столбцами, первая проблема, которую я решил, - это то, что другой столбец может быть 0 или null, Теперь, когда я его вычисляю, он всегда дают мне 100 или 0 в результате колонке «скидка»Почему postgres вычисляет процент неправильно (на основе результата столбцов)

Product.active.select("*, 100-(price/(
(CASE WHEN(market_price IS NULL OR market_price = 0) 
THEN price ELSE market_price END)))*100 
AS discount") 

Все результаты были 0 или 100: \

Пытался решить с суб функции, но все-таки дал мне тот же неверный процент.

ответ

1

Хорошо, после того, как будет Psql консоль, я нашел, что кто-то сделал price и original_price являются integer и не numeric, это вызвало плохое округление.

решаемые объявляющего колонного типа, как числовая:

Product.active.select("*, (100 - ((price::numeric/
(CASE WHEN(market_price IS NULL OR market_price = 0) 
THEN price ELSE market_price END)::numeric)*100.0)) 
AS discount") 
+3

Не было бы лучше, чтобы исправить плохую схему базы данных с миграцией, а не добавлять этот Hacky обходной путь для конкретного запроса? –

+3

Аналогично, я бы посоветовал исправить изворотливые значения базы данных '0' и' NULL' для 'market_price', вместо того, чтобы требовать такого обхода в вашем запросе. –

+0

@TomLord благодарит за подсказку! –

Смежные вопросы