Как объединить агрегатные функции в MySQL? - PullRequest
9 голосов
/ 05 августа 2010

Я только изучаю MySQL - есть ли способ комбинировать (или вкладывать) агрегатные функции?

С учетом запроса:

SELECT user, count(answer) FROM surveyValues WHERE study='a1' GROUP BY user;

Это даст мне количество вопросов, на которые ответил каждый пользователь. Что я действительно хочу, так это среднее количество вопросов, ответивших на пользователя ... что-то вроде:

SELECT avg(count(answer)) FROM surveyValues WHERE study='a1';

Как правильно рассчитать эту статистику?

Если это возможно, есть ли способ затем разбить эту статистику по каждому вопросу? (пользователи могут ответить на один и тот же вопрос несколько раз). Что-то вроде:

SELECT avg(count(answer)) FROM surveyValues WHERE study='a1' GROUP BY question;

Ответы [ 2 ]

12 голосов
/ 05 августа 2010

Вы должны использовать подзапросы:

  SELECT x.user, 
         AVG(x.cnt)
    FROM (SELECT user, COUNT(answer) AS cnt
            FROM surveyValues 
           WHERE study='a1' 
        GROUP BY user) x
GROUP BY x.user

Нельзя объединить агрегат с другим агрегатом.Вы могли бы обернуть аналитику в агрегат, если бы MySQL поддерживал аналитические / ранжирующие / оконные функции ...

0 голосов
/ 05 августа 2010

да - все это выглядит разумно.

Вы пробовали их и получили неожиданные результаты?

обычно я ожидаю, что вы также включите колонку управления в список выбора:

SELECT question, avg(count(answer)) 
FROM surveyValues 
WHERE study='a1' 
GROUP BY question; 
...