Вложенные функции агрегации - это Oracle-ism.Я лично нахожу их довольно запутанными.Но MAX(COUNT( . . . ))
- это то же самое, что и:
select max(cnt)
from (select . . . , count(<something>) as cnt
from t
group by . . .
) x;
То есть он выполняет две агрегации: одну с group by
и одну без.Внешний не может возвращать неагрегированные столбцы.Вот почему вы получаете сообщение об ошибке.
Хочу заметить, что для второго запроса вам нужно отфильтровать по году как внутри, так и снаружи.Поэтому запрос может вернуть правильные результаты, но вы хотите сделать:
SELECT unitcode, TO_CHAR(ofyear, 'YYYY') AS year, semester,
COUNT(studid) AS student_count
FROM uni.enrolment
WHERE TO_CHAR(ofyear, 'YYYY') = '2013')
GROUP BY unitcode, TO_CHAR(ofyear, 'YYYY'), semester
HAVING COUNT(studid) = (SELECT MAX (COUNT (studid))
FROM uni.enrolment
GROUP BY unitcode, ofyear, semester
HAVING TO_CHAR(ofyear, 'YYYY') = '2013'
)
ORDER BY unitcode;
Обратите внимание, что я также поместил выражение в GROUP BY
для year
.Вы хотите агрегировать по году, а не по исходной дате.