Подтвердить что ты не робот

Среднее значение count() в одном запросе

В настоящее время я работаю над заданием, которое требует от меня найти среднее количество ресурсов для каждого модуля. Текущая таблица выглядит следующим образом:

ResourceID   ModulID
   1            1
   2            7
   3            2
   4            4
   5            1
   6            1

Итак, в основном, я пытаюсь выяснить, как получить среднее количество ресурсов. Единственный соответствующие тестовые данные здесь для модуля 1, который имеет 3 разных ресурсов, связанных с ним. Но мне нужно показать все результаты.

Это мой код:

select avg(a.ress) GjSnitt, modulID
from 
(select count(ressursID) as ress 
 from ressursertiloppgave
 group by modulID) as a, ressursertiloppgave r
group by modulID;

Очевидно, что он не работает, но сейчас я теряю то, что мне нужно изменить. Я был бы очень признателен за любой вклад, который у вас есть.

4b9b3361

Ответ 1

Это запрос, который вы выполняете, написанный в чуть менее тупой синтаксисе.

SELECT
  avg(a.ress) as GjSnitt
  , modulID
FROM
  (SELECT COUNT(ressursID) as ress 
   FROM ressursertiloppgave
   GROUP BY modulID) as a
CROSS JOIN ressursertiloppgave r    <--- Cross join are very very rare!
GROUP BY modulID;

Вы переходите к таблице, делая (6x6 =) 36 строк в общей сложности и уменьшая это до 4, но поскольку общее количество составляет 36, результат неверен.
Вот почему вы никогда не должны использовать неявные объединения.

Перепишите запрос на:

SELECT AVG(a.rcount) FROM 
  (select count(*) as rcount 
   FROM ressursertiloppgave r
   GROUP BY r.ModulID) a

Если вы хотите, чтобы отдельная строка и находилась в среднем внизу:

SELECT r1.ModulID, count(*) as rcount
FROM ressursertiloppgave r1
GROUP BY r1.ModulID 
UNION ALL 
  SELECT 'avg = ', AVG(a.rcount) FROM 
  (select count(*) as rcount 
   FROM ressursertiloppgave r2
   GROUP BY r2.ModulID) a