Как объединить агрегатные функции в MySQL?

Я только изучаю 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;

person Ender    schedule 04.08.2010    source источник


Ответы (2)


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

  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 поддерживает функции аналитики/ранжирования/окна...

person OMG Ponies    schedule 04.08.2010
comment
Действительно, подзапросы являются ответом. Если у вас есть более одного запроса, связанного с количеством ответов на пользователя, вы можете подумать о том, чтобы поместить подзапрос в представление. - person tdammers; 05.08.2010
comment
О, чувак, ты можешь использовать псевдонимы столбцов? СУПЕР-отлично. (Я уверен, что это звучало супер-наивно, но это просто сделало мой день). Спасибо, работает отлично. - person Ender; 05.08.2010

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

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

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

SELECT question, avg(count(answer)) 
FROM surveyValues 
WHERE study='a1' 
GROUP BY question; 
person Randy    schedule 04.08.2010