Я пытаюсь выполнить следующий запрос, чтобы обеспечить% строк в моей patients
таблице, которые имеют значение refinst
столбца. Я продолжаю получать результат 0.
select (count (refinst) / (select count(*) from patients) * 100) as "Formula"
from patients;
Таблица содержит 15556 строк и select count(refinst) from patients
сообщает, что 1446 из них имеют значение в refinst
столбце. Ответ, который я хотел бы получить от запроса, был бы 30,62 ( 1446/15556*100=30.62XXXXX
округленный до двух десятичных знаков).
Я почти уверен, что это как-то связано с типом данных результатов подсчета (я предполагаю целые числа). Если я разделю целое число на целое число, а результат будет меньше 0, он будет усечен до 0 правильно? Если это так, может кто-нибудь показать мне, как привести результаты подсчета к числу с двумя десятичными знаками, чтобы результат также округлялся до 2 десятичных знаков?
Я уверен, что есть лучший способ написать этот код, чем несколько операторов подсчета. Я ищу более эффективный для процессора способ написать этот запрос в частности.
источник
Ответы:
Вы не использовать подзапрос. Оба агрегата могут быть получены из одного и того же запроса. Дешевле.
Кроме того, это не относится к оконным функциям, так как вы хотите вычислить один результат, а не один результат на строку.
Приведение к любому числовому типу, который поддерживает дробные цифры, как уже объяснено @a_horse .
Так как вы хотите до
round()
двух дробных цифр, я предлагаюnumeric
(это то же самое, что иdecimal
в Postgres).Но достаточно привести одно значение, участвующее в расчете, предпочтительно первое. Postgres автоматически выбирает тип, который не теряет информацию.
Обычно это хорошая идея, чтобы умножить, прежде чем делить . Это обычно сводит к минимуму ошибки округления и обходится дешевле.
В этом случае первое умножение (
count(refinst) * 100
) может быть вычислено с использованием дешевой и точнойinteger
арифметики. Только тогда мы разыгрываемnumeric
и делим на следующиеinteger
(которые мы не разыгрываем дополнительно).Округлено до двух дробных цифр:
источник
Вам нужно привести каждое число, участвующее в делении, к типу, который поддерживает десятичные дроби:
Вы также можете попробовать оконную функцию вместо скалярного подзапроса. Это может быть быстрее:
источник
Я понимаю, что этой ветке пару лет, но: попробуйте умножить на 100,0, а не на 100. Это должно автоматически привести к результату как число с плавающей точкой, а не как целое число.
источник