Как я могу использовать COUNT в одном запросе с ROUND() и AVG()?

#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 предложении.