Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Average on a count() in derselben Abfrage

Dies ist die Abfrage, die Sie ausführen, geschrieben in einer etwas weniger stumpfen Syntax.

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;

Sie verknüpfen die Tabelle über Kreuz, erstellen (6x6=) insgesamt 36 Zeilen und verdichten diese auf 4, aber da die Gesamtzahl 36 beträgt, ist das Ergebnis falsch.
Deshalb sollten Sie niemals implizite Joins verwenden.

Schreiben Sie die Abfrage um in:

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

Wenn Sie die individuelle Zeilenanzahl und möchten der Durchschnitt ganz unten macht:

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