Сравнение графов того же столбца MySQL, чтобы получить процент - PullRequest
0 голосов
/ 30 апреля 2018

Что мне нужно сделать, это следующее:

Получите процент от всех опросов классов в этой программе, где ответ на вопрос 1 был больше 3.

У меня есть таблица, которая содержит огромный набор данных опросов в классе. Проблема в том, что, например, в GENE01 могут быть проведены 5 опросов 5 разных студентов; поэтому у меня 4 класса, но с ними связано 50 опросов.

Так что в настоящее время я выполняю два запроса для выполнения этой задачи, но я бы хотел, чтобы это был один запрос. Вот два запроса, которые я хочу объединить.

-- Query 1
SELECT COUNT(survey_ID) as total 
FROM survey_Table
WHERE courseName LIKE 'GENE01'
   OR courseName LIKE 'GENE02'
   OR courseName LIKE 'GENE03'
   OR courseName LIKE 'GENE04'
GROUP BY survey_ID WITH ROLLUP
; 
-- Query 2
SELECT COUNT (survey_ID) as newTotal
FORM survey_Table
WHERE courseName LIKE 'GENE01' AND question1 > 3
   OR courseName LIKE 'GENE02' AND question1 > 3
   OR courseName LIKE 'GENE03' AND question1 > 3
   OR courseName LIKE 'GENE04' AND question1 > 3
GROUP BY survey_ID WITH ROLLUP
; 

Затем я вручную беру калькулятор со своего стола и делаю newTotal / total * 100. Я не могу понять подзапрос (или что вам нужно сделать), чтобы выполнить эту простую задачу. Проблема, которую, я думаю, у меня возникла, заключается в том, что я не знаю, как сравнить счетчики в одном столбце.

Спасибо всем, и извините, я довольно новичок в MySQL.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Вы можете объединить оба запроса по survey_id

    select t1.survey_ID, t2.newTotal/t1.total 
    from (
    SELECT survey_ID, COUNT (survey_ID) as newTotal
    FORM survey_Table
    WHERE courseName LIKE 'GENE01' AND question1 > 3
       OR courseName LIKE 'GENE02' AND question1 > 3
       OR courseName LIKE 'GENE03' AND question1 > 3
       OR courseName LIKE 'GENE04' AND question1 > 3
    GROUP BY survey_ID ) 
    INNER JOIN (

    SELECT survey_ID, COUNT(survey_ID) as total 
    FROM survey_Table
    WHERE courseName LIKE 'GENE01'
       OR courseName LIKE 'GENE02'
       OR courseName LIKE 'GENE03'
       OR courseName LIKE 'GENE04'
    GROUP BY survey_ID ) t2. ON t1.survey_ID = t2.survey_ID 
0 голосов
/ 30 апреля 2018

Условное агрегирование - возможный подход:

 SELECT s.survey_ID
      , SUM(1)                AS total
      , SUM(s.question1 > 3)  AS newTotal
   FROM survey_Table s
  WHERE s.courseName IN ('GENE01','GENE02','GENE03','GENE04')
  GROUP
     BY s.survey_ID
   WITH ROLLUP

Обратите внимание, что условие s.question1 > 3 является сокращением MySQL. MySQL оценивает это и возвращает 1 для TRUE, возвращает 0 для FALSE и NULL, если его ноль.

Это почти эквивалентно более портативному стандарту ANSI:

 SUM(CASE WHEN s.question1 > 3 THEN 1 ELSE 0 END)   AS newTotal

Существует разница в обработке значений NULL.

Более точная перезапись SUM(s.question1 > 3) будет

 SUM(CASE WHEN s.question1 > 3 THEN 1 WHEN s.question1 IS NULL THEN NULL ELSE 0 END)

Для каждой возвращаемой строки вычисляется выражение внутри агрегата SUM(). 1 всегда оценивается как 1.

Не стесняйтесь опускать survey_ID из списка SELECT. Обычно, когда мы делаем GROUP BY foo, нас интересует, какая строка результатов связана с какой foo.


Вопрос задает вопрос о получении «процента». Мы можем выполнить деление в выражении в списке SELECT. Но я не думаю, что "with rollup" даст вам то, что вы ожидаете.

Вот пример:

 SELECT SUM(1)                AS total
      , SUM(s.question1 > 3)  AS newTotal

      , 100.0
      * SUM(s.question1 > 3) 
      / SUM(1)                 AS percentage

   FROM survey_Table s
  WHERE s.courseName IN ('GENE01','GENE02','GENE03','GENE04')

В этом примере я решил опустить предложение GROUP BY. Таким образом, это вернет одну общую итоговую строку, которая даст нам общий процент. (Если бы мы использовали GROUP BY и WITH ROLLUP, процент был бы добавлен. И, вероятно, это не тот результат, которого мы добиваемся.)

...