Вычисление процента с помощью SQL на основе количества логических полей - PullRequest
0 голосов
/ 08 мая 2020

У меня есть таблица PostgreSQL, аналогичная следующей таблице, в которой содержится информация об обратной связи для статей на веб-сайте. Я хочу иметь возможность выполнить запрос, чтобы получить общее количество ответов и процент, при котором was_useful истинно.

Я попытался выполнить следующее, основываясь на том, что я смог найти в Интернете, но он просто говорит 100% результатов оказались полезными.

SELECT p.foreign_key_id,
       count(p.foreign_key_id) AS total_responses,
       count(CASE WHEN p.was_useful=true THEN 1 ELSE 0 END) / count(p.foreign_key_id) AS percentage_useful
FROM
  table_name p
GROUP BY 
  p.foreign_key_id;

Пример таблицы:

| id | foreign_key_id | was_useful |  
|----|----------------|------------|  
| 1  | 1              | true       |  
| 2  | 1              | false      |  
| 3  | 1              | true       |  
| 4  | 1              | false      |  
| 5  | 2              | false      |  
| 6  | 2              | false      |  
| 7  | 2              | false      |  
| 8  | 2              | true       |  
| 9  | 3              | false      |  
| 10 | 3              | false      |

Текущий выход:

| foreign_key_id | total_responses | percentage_useful |
|----------------|-----------------|-------------------|
| 1              | 4               | 1                 |
| 2              | 4               | 1                 |
| 3              | 2               | 1                 |

Желаемый результат:

| foreign_key_id | total_responses | percentage_useful |
|----------------|-----------------|-------------------|
| 1              | 4               | .5                |
| 2              | 4               | .25               |
| 3              | 2               | 0                 |

1 Ответ

1 голос
/ 08 мая 2020

Вы можете использовать AVG() для вычисления отношения:

SELECT p.foreign_key_id, count(*) as total_responses,
       avg( (p.was_useful)::int ) as useful_ratio
FROM table_name p
GROUP BY p.foreign_key_id;

Я должен отметить, что ваш метод - хотя и более подробный - должен работать. Проблема в том, что Postgres выполняет целочисленное деление. Итак, если вы измените then 1 на then 1.0, будет получено нецелое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...