Найти процент строк, которые удовлетворяют условию без округления - PullRequest
3 голосов
/ 23 марта 2020

Я пытаюсь найти процент строк, которые удовлетворяют указанному c условию. Мой запрос близок, но ответ всегда округляется до ближайшего целого числа.

Например, этот запрос ниже возвращает 6, но он должен вернуть 6.25. Это означает, что 6,25% строк соответствуют этому условию. Как бы я это сделал?

select sum(case when name like 'H%' then 1 else 0 end) * 100 / count(*)
from category

Ответы [ 3 ]

1 голос
/ 23 марта 2020

Просто добавьте десятичную точку:

select sum(case when name like 'H%' then 1.0 else 0 end) * 100 / count(*)
from category;

Postgres делает целочисленное деление.

Вы также можете express это используя avg():

select avg(case when name like 'H%' then 100.0 else 0 end)
from category;

Десятичная точка не нужна. Хотя Postgres выполняет целочисленное деление целых чисел, оно вычисляет среднее целых чисел, используя десятичные точки.

И это можно выразить более просто (при условии, что name не NULL):

select avg( (name like 'H%')::int ) * 100
from category;
0 голосов
/ 23 марта 2020

Вы выполняете целочисленное деление , и таким образом пропускаете все справа от десятичной точки. Если вы используете литерал с плавающей точкой 100.0, вы должны быть в порядке:

select sum(case when name like 'H%' then 1 else 0 end) * 100.0 / count(*)
from category
0 голосов
/ 23 марта 2020

Вам нужно десятичное значение, в противном случае, поскольку числитель и знаменатель являются целыми числами, Postgres выполняет целочисленное деление.

Но здесь я бы просто использовал avg() - для которого вы не делаете нужно целочисленное значение:

select avg(case when name like 'H%' then 1 else 0 end) * 100
from category
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...