Использование postgres tablefunc crosstab () для подсчета неправильных ответов - PullRequest
1 голос
/ 12 июня 2019

У меня есть представление (назовем его «фрукт»), в котором есть столбец правильных ответов и связанных с ним неправильных ответов на экзамене с несколькими вариантами ответов, и я хотел бы посчитать, какие неправильные ответы были выбраны наиболее часто (легко запутанныеиз них).Представление выглядит примерно так:

correct_answer | wrong_response
-------------------------------
apple          |   pear
apple          |   pear
apple          |   banana
banana         |   apple
banana         |   pear
banana         |   pear
banana         |   pear
pear           |   apple

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

wrong_response | apple | banana | pear
---------------------------------------
apple          | 0     | 1      | 1
banana         | 1     | 0      | 0
pear           | 2     | 3      | 0

Я был здесь до с этой функцией, но я не пытался считать вещи в этот раз.Любая помощь будет высоко ценится!

РЕДАКТИРОВАТЬ: Для будущих людей оба эти решения работают!Условное агрегирование, однако, является более гибким.Решение кросс-таблицы работает, только если у вас есть все возможности в запросе.Например, если исключить грушу (или добавить киви), решение кросс-таблицы возвращает ошибку.Условное агрегирование возвращает результаты независимо от того, исключены ли вы (или добавлены в настоящее время несуществующие) записи.Спасибо за помощь, все.

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Предположим, вы уже сделали: CREATE EXTENSION tablefunc;

Тогда, чтобы достичь желаемого с помощью функции crosstab (), тогда:

SELECT *
FROM crosstab('SELECT wrong_response,
                      correct_answer,
                      count(*)
               FROM fruit
               GROUP BY wrong_response, correct_answer 
               ORDER BY wrong_response',

              'SELECT correct_answer
               FROM fruit
               GROUP BY correct_answer
               ORDER BY correct_answer')

AS (wrong_answer varchar(20),
    apple bigint,
    banana bigint,
    pear bigint);

Выше код даст вам следующий результат, который вы хотите: enter image description here

Обратите внимание, что здесь 0 выводится как ноль, чтобы получить именно то, что вы хотите, вам просто нужно немного изменить select:

SELECT
    wrong_answer,
    coalesce(apple, 0) as apple,
    coalesce(banana, 0) as banana,
    coalesce(pear, 0) as pear
FROM crosstab('SELECT wrong_response,
                      correct_answer,
                      count(*)
               FROM fruit
               GROUP BY wrong_response, correct_answer 
               ORDER BY wrong_response',

              'SELECT correct_answer
               FROM fruit
               GROUP BY correct_answer
               ORDER BY correct_answer')

AS (wrong_answer varchar(20),
    apple bigint,
    banana bigint,
    pear bigint)

Выше вы получите то, что хотите:

enter image description here

1 голос
/ 12 июня 2019

Если вы знаете столбцы, вы можете использовать условное агрегирование:

select wrong_response,
       count(*) filter (where correct_answer = 'apple') as apple,
       count(*) filter (where correct_answer = 'pear') as pear,
       count(*) filter (where correct_answer = 'banana') as banana
from t
group by wrong_response;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...