Альтернативное использование Имея в mysql - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь получить записи, где avg больше 81, я заметил, что не могу использовать простой, где avg (оценка)> 80

Но использование оператора Have проблематично c, так как также он не учитывает, где среднее значение по отдельным записям превышает 80, но учитывает среднее по группе. Есть ли альтернатива?

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

В общем, если мы хотим вернуть агрегаты (SUM, AVG), а также вернуть детали, которые составляют агрегат, мы обычно используем два SELECT

. В качестве элементарного примера рассмотрим таблицу «test_score»

test_id  student_id  score
-------  ----------  -----
    101           6     90
    101           7     71
    101           8     88
    222           6     93
    222           7     78
    222           8     81

Мы можем рассчитать среднюю оценку для каждого теста с помощью запроса SELECT ... GROUP BY.

SELECT r.test_id    AS test_id
     , AVG(r.score) AS avg_score
     , MAX(r.score) AS high_score
  FROM test_score r
 GROUP
    BY r.test_id

Мы ожидаем, что мы вернем набор результатов, подобный следующему:

test_id  avg_score
-------  ---------
    101         83
    222         84

Мы можем использовать этот запрос как встроенное представление , то есть мы заключаем его в скобки и ссылаться на него, как на таблицу в предложении FROM другого SELECT.

В качестве демонстрации, чтобы вернуть оценки студентов, которые были лучше (или равны) средним для каждого теста:

SELECT s.test_id
     , s.avg_score
     , t.student_id
     , t.score
  FROM ( -- inline view to get average score for each test_id
         SELECT r.test_id    AS test_id
              , AVG(r.score) AS avg_score
           FROM test_score r
          GROUP
             BY r.test_id
       ) s
  LEFT
  JOIN test_score t
    ON t.test_id  = s.test_id 
   AND t.score   >= s.avg_score
 ORDER
    BY t.test_id
     , s.score DESC

И мы ожидаем, что он вернет что-то вроде:

test_id  avg_score  student_id  score
-------  ---------  ----------  -----
    101         83           6     90
    101         83           8     88
    222         84           6     93

Первые два столбца, возвращенные из встроенного представления, являются результатом агрегата (AVG). Последние два столбца являются строками подробностей, сопоставленными со строками из совокупного результата.


Подводя итог основной точке зрения:

Чтобы вернуть агрегаты вместе с подробностями, нам обычно требуется два SELECT.

Один SELECT для получения агрегатов (с GROUP BY, если агрегаты «за» что-то или другое)

Другой SELECT для получения деталей и соответствия агрегату.

0 голосов
/ 17 апреля 2020

Если средняя оценка, вычисляемая в вашем запросе, уже верна, у вас просто проблемы с фильтрацией, просто оберните ее в скобках и выберите из нее

select * from (
SELECT Count(entry_id)                           AS Filled, 
   q.question                                    AS Questions, 
   AVG(ag.score)                                 AS TOTAL 
FROM   entry e
   LEFT JOIN entry_answer ea
          ON ea.entry_id= e.entry
   LEFT JOIN question q 
          ON q.question_id = ea.question_id 
   LEFT JOIN question_group qg 
          ON ea.question_parent_id = qg.question_parent_id 
   LEFT JOIN answer_group ag
          ON ag.question_id = qg.question_parent_id 
   JOIN sent_list using (sent_list_id) 
WHERE
   entry_group_id = 2427
   AND ag.score >= 0 
   AND ea.rated_answer_id = ag.rated_answer_id 
   AND sent_id = 6156 
   AND e.entry_date BETWEEN '2018-01-01' AND '2019-12-31'
   group by ea.question_id
) results where total >= 81
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...