SQL суммировать на основе условия - PullRequest
0 голосов
/ 18 января 2019

Допустим, у меня есть таблица с именем Table1, которая содержит три столбца: VALUE, CODE и TYPE. Столбец VALUE содержит оценки от 1 до 4 по различным вопросам. Столбец CODE содержит код, относящийся к вопросу. Столбец TYPE указывает, является ли вопрос частью бумажного (PAP) или онлайн (ONL) опроса.

Вот пример того, как выглядит стол.

#Table1

VALUE    CODE    TYPE
-----   ------  ------ 
  2      Q2      ONL 
  1      Q2      PAP
  3      Q2      ONL
  4      Q2      ONL
  1      Q2      ONL
  1      Q2      ONL
  1      Q2      PAP
  2      Q2      ONL
  4      Q2      ONL
  2      Q2      ONL
  3      Q1      ONL
  1      Q1      ONL
  4      Q1      ONL
  3      Q1      ONL
      and so on...

Моя цель

Чтобы суммировать эту таблицу, используя SQL-запрос (Oracle), такой что -

1) I сначала считать все значения, которые являются 1 ИЛИ 2 для CODE Q2

2) И разделите это число на общее число значений для Q2

3) Сгруппировать результаты по TYPE, чтобы я сгруппировал результаты для ONL и PAP .

Ожидаемый результат

Так что в нашем случае результат этого запроса будет -

TYPE      SCORE
PAP       0.625 (5/8)
ONL       1     (2/2)

Моя попытка

Столь же простой, как кажется, я не могу получить правильное значение. Я чувствую, что это требует вложенного запроса для хранения различных значений, но я не могу найти правильный пример, чтобы направлять меня. Вот моя неправильная попытка -

SELECT TYPE, VALUE/COUNT(VALUE) as SCORE FROM Table1
where
CODE = 'Q2' AND
VALUE in (1,2)
GROUP BY TYPE

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Вы можете просто сделать:

select type, avg(case when value in (1, 2) then 1.0 else 0 end) 
from table1
where code = 'Q2'
group by type;
0 голосов
/ 18 января 2019

Несколько способов сделать это.
Проблема с вашим запросом состоит в том, что вы не выполнили второй шаг - ПОЛУЧИЛИ ОБЩЕЕ количество ответов за Q2.

Вот мой SQLFiddle: http://www.sqlfiddle.com/#!9/898b3f/7

SELECT TYPE, 
COUNT(VALUE), 
(select count(*) from table1 where code = 'Q2') ,
COUNT(VALUE) / (select count(*) from table1 where code = 'Q2') as score
FROM Table1
where
CODE = 'Q2' AND
VALUE in (1,2)
GROUP BY TYPE
0 голосов
/ 18 января 2019

Вот оно:

select type, cnt_value/sum_value as score 
 FROM (
  SELECT type, count (value) as cnt_value , sum (value) as sum_value 
    FROM Table1
   WHERE
    CODE = 'Q2' AND
   VALUE in (1,2)
   GROUP by type
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...