#sql #oracle
#sql #Oracle
Вопрос:
Мне нужно написать запрос, в котором мне нужно сначала подсчитать билеты, проданные на спектакли в театре, затем вычислить среднее количество билетов, проданных в каждом театре, и округлить его до двух знаков после запятой, и эти значения должны быть отсортированы по количеству проданных билетов. В принципе, я хочу найти среднее количество проданных билетов для каждого театра. Я перепробовал так много разных вариантов, но у меня разные ошибки. Когда я попытался запустить это, появилась эта ошибка :
Ошибка SQL: ORA-00937: не является групповой функцией с одной группой.
SELECT
t.id_theater
, s.id_spectacle
, ROUND((AVG(COUNT(tickets.id_ticket))), 2) average_tickets_theatre
FROM
tickets tick
, theater t
, spectacles s
WHERE
tick.id_spectacle = s.id_spectacle
AND t.id_theater = s.id_theater
GROUP BY
t.id_theater
, s.id_spectacle
ORDER BY
average_tickets_theatre
Я попытался добавить предложение HAVING, но появилась еще одна ошибка:
Ошибка SQL: ORA-00933: команда SQL не завершилась должным образом.
Я уверен, что проблема заключается в том, что я пытаюсь использовать COUNT с ROUND() и AVG() , но я действительно не знаю, что делать на данный момент, и был бы признателен за любую помощь.
Комментарии:
1. Пожалуйста, посмотрите на свои теги (под вопросом). Oracle или SQL Server? Почему у вас есть тег разработчика Oracle SQL? (Скорее всего, его следует удалить). Тогда — почему
having
предложение? Вы не объяснили никаких условий об исключении любых групп после агрегирования. Должны ли мы просто забыть этот комментарий в вашем вопросе?2. Я удалил тег SQL Server, поскольку вы явно используете Oracle
3. что ты собираешься делать ? пожалуйста, объясните проблему и предоставьте примеры данных и желаемый результат
4. брать среднее значение count(*) — скалярное значение — не имеет смысла.
Ответ №1:
Среднее количество билетов на одно представление будет равно общему количеству билетов, деленному на количество зрелищ. Довольно простой способ вычислить это так:
SELECT s.id_theater,
COUNT(*) / COUNT(DISTINCT id_spectacle) as average_tickets_theatre
FROM tickets t JOIN
spectacles s
ON t.id_spectacle = s.id_spectacle
GROUP BY t.id_theater
ORDER BY average_tickets_theatre;
Я позволю вам справиться с округлением значения.
Обратите внимание на использование правильного, явного, стандартного, читаемого JOIN
синтаксиса. Никогда не используйте запятые в FROM
предложении.