SQL-запрос - подсчет количества ответов «да» для группы вопросов - PullRequest
1 голос
/ 06 мая 2011

У меня есть таблица для приложения, связанного с опросом, в котором есть 5 вопросов, требующих ответов Да (1) или Нет (0). Дизайн таблицы выглядит следующим образом:

CREATE TABLE score ( project_id int NOT NULL, resp_id int NULL, q1 int, q2 int, q3 int, q4 int, q5 int, );

Пример данных:

project_id resp_id q1 q2 q3 q4 q5
1          86      1  1  1  1  1
1          114     1  1  1  1  1
1          118     0  1  1  1  0
2          154     1  1  0  1  1
2          178     1  1  1  0  1
3          182     1  0  1  1  1
3          190     1  1  1  0  1
3          208     1  1  1  1  1
3          300     1  1  1  0  0
3          329     1  1  1  1  1

Что мне нужно сделать, это написать запрос, который сгенерирует отчет с разбивкой по project_id, числу респондентов, которые предоставили 0 ответов «да» (0 из 5), 1 ответ «да» (1 из 5), 2 ответа «да» (2 из 5) и т. Д. Другими словами, сколько респондентов отвечает «да» на все вопросы, да на 4 из 5 вопросов и т. Д.

выполнимо? Любые предложения приветствуются:)

Ответы [ 4 ]

3 голосов
/ 06 мая 2011
SELECT
  project_ID,
  q1 + q2 + q3 + q4 + q5 AS NumYesAnswers,
  COUNT(*) AS NumResponses
FROM
  score
GROUP BY
  project_ID, q1 + q2 + q3 + q4 + q5

EDIT

Я бы добавил это как комментарий к ответу Лобо, но форматирование не сработало. Вы можете добиться того же эффекта чуть более изящно с PIVOT:

SELECT
    Project_ID, "0" AS NoToAll, "1", "2", "3", "4", "5"
FROM
    (
    SELECT Project_ID, Q1 + Q2 + Q3 + Q4 + Q5 AS NumYeses, COUNT(*) AS Answers
    FROM Score
    GROUP BY Project_ID, Q1 + Q2 + Q3 + Q4 + Q5
    ) AS X
PIVOT
    (SUM(Answers) FOR NumYeses IN ("0", "1", "2", "3", "4", "5")) AS Y
0 голосов
/ 06 мая 2011
-- Be careful about NULL fields(the following is assuming that the q* are NOT NULL fields)
SELECT project_id, 
    SUM(allzeroes) AS NoToAll, SUM(onlyone) AS YesToOne, SUM(two) AS YesToTwo, SUM(three)  AS YesToThree, SUM(four) AS YesToFour, SUM(five) AS YesToAll 
FROM (
    SELECT project_id, 
        (CASE WHEN  (q1 + q2 + q3 + q4 + q5) = 0 THEN COUNT(*) ELSE 0 END) AS allzeroes,
        (CASE WHEN  (q1 + q2 + q3 + q4 + q5) = 1 THEN COUNT(*) ELSE 0 END) AS onlyone,
        (CASE WHEN  (q1 + q2 + q3 + q4 + q5) = 2 THEN COUNT(*) ELSE 0 END) AS two,
        (CASE WHEN  (q1 + q2 + q3 + q4 + q5) = 3 THEN COUNT(*) ELSE 0 END) AS three,
        (CASE WHEN  (q1 + q2 + q3 + q4 + q5) = 4 THEN COUNT(*) ELSE 0 END) AS four,
        (CASE WHEN  (q1 + q2 + q3 + q4 + q5) = 5 THEN COUNT(*) ELSE 0 END) AS five
    FROM score
    GROUP BY project_id, (q1 + q2 + q3 + q4 + q5) ) temp_table
GROUP BY project_id

PS: Пожалуйста, исправьте образец заголовка данных;Я не могу отредактировать ваш вопрос.Спасибо!

0 голосов
/ 06 мая 2011

Джон на все руки ответил хорошо. Кроме того, используйте CTE (Common Table Expression), если не хотите повторять оператор сумм.

With
ProYes as (
    select project_id,
    q1 + q2 + q3 + q4 + q5 as NumYes
    from score)
select project_id, NumYes, COUNT(*) as NumAnswers
from ProYes
group by project_id, NumYes
0 голосов
/ 06 мая 2011

Создает хранимую процедуру и задает значения как переменные, после чего вы можете передать их с помощью оператора select внутри sproc и условно с предложением where.

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