AVG, SUM, GROUP BY -> Abfrage?
Rouven
- datenbank
Hallo Leute,
ich habe mal eine kleine SQL-Frage für euch, ich selbst bekomme es (schon gar nicht ohne SUBSELECTS) nicht hin. Es geht um eine Access-Datenbank, wobei sich das ja in den hier zu verwendenden SQL-Strukturen nicht sonderlich von MySQL unterscheidet.
Folgende Situation:
Tabelle spiele:
matchid, dauer, ...
matchid ist dabei ein Fremdschlüssel, dieser ordnet mehrere Spiele einem Match zu.
Ich möchte nun in einer SQL-Abfrage die durchschnittliche Dauer eines Matches errechnen, d.h. im Klartext die Berechnung des Durchschnittes der Summe der Dauern bei gleicher matchid
Probiert habe ich folgende Abfrage, die jedoch nicht ausgeführt wird, weil eine Aggregatfunktion doppelt angewendet wird (soweit einleuchtend):
SELECT AVG(SUM(dauer)) AS d FROM spiele GROUP BY matchid
Ich hätte ja irgendwas im Sinne von
SELECT AVG(summenzug) AS d
FROM
SELECT SUM(dauer) AS d
FROM spiele
GROUP BY matchid
probiert, aber erstens weiß ich nicht, ob mich das ans Ziel gebracht hätte und zweitens ist da ohne SubSelects Dead-End.
Kann mir jemand mal einen Denkanstoss geben außer dem, mit Hilfe einer VBScript-Routine den Durchschnitt selber auszurechnen?
MfG
Rouven
Korrektur:
SELECT AVG(summenzug) AS d
FROM
SELECT SUM(dauer) AS d
FROM spiele
GROUP BY matchid
Muss natürlich heißen
SELECT AVG(summenzug) AS d
FROM
SELECT SUM(dauer) AS summenzug
FROM spiele
GROUP BY matchid
MfG
Rouven
Oi,
Tabelle spiele:
matchid, dauer, ...
Ich möchte nun in einer SQL-Abfrage die durchschnittliche Dauer eines Matches errechnen, d.h. im Klartext die Berechnung des Durchschnittes der Summe der Dauern bei gleicher matchid
was ist denn der Durchschnitt der Summe? Möglicherweise suchst Du die _durchschnittliche_ Spieldauer:
SELECT AVG(dauer) AS d
FROM spiele
GROUP BY matchid
Die Notwendigkeit für die Summenfunktion erschließt sich mir nicht aus Deiner Aufgabenstellung - oder habe ich etwas übersehen?
HTH Robert
Hi,
ich wusste, der Satz ist doch zu komplex ;-).
Die durchschnittliche Dauer der Spiele ist einfach. Ich will jetzt die Dauer eines Matches errechnen (=Summe von 2-5 Spielen, halt die mit gleicher matchid) und will von diesen Summen dann den Durchschnitt.
MfG
Rouven
Oi!
ich wusste, der Satz ist doch zu komplex ;-).
Scheint so...
Die durchschnittliche Dauer der Spiele ist einfach. Ich will jetzt die Dauer eines Matches errechnen (=Summe von 2-5 Spielen, halt die mit gleicher matchid) und will von diesen Summen dann den Durchschnitt.
Doch was übersehen: mehrere Spiele = ein Match! Ginge das vielleicht so:
SELECT SUM(dauer)/COUNT(dauer)
FROM blah
GROUP BY id
?
HTH Robert
Hmpf,
ich fürchte das geht aus dem Grunde nicht, weil damit die Anzahl der spiele pro match unberücksichtigt bleibt, das können ja wie gesagt unterschiedlich viele sein, wenn ich die aber direkt mittele, dann kommt da vermutlich was falsches raus. Aber ich werd's mal ausprobieren.....
MfG
Rouven
Oi!
ich fürchte das geht aus dem Grunde nicht, weil damit die Anzahl der spiele pro match unberücksichtigt bleibt, das können ja wie gesagt unterschiedlich viele sein, wenn ich die aber direkt mittele, dann kommt da vermutlich was falsches raus.
Ist die Anzahl der Spiele pro Match nicht gleich der Anzahl der DS in der befragten Tabelle? Oder habe ich das immer noch nicht verstanden? Wenn ja, dann gruppiert der SELECT die Spiele eines Matches nach der ID und wendet dann auf diese Aggregationen die Aggregatfunktionen an: SUM(dauer)/COUNT(dauer) -> Summe der Dauern geteilt durch die Anzahl der Dauern (klingt etwas seltsam; Du könntest auch eine andere Spalte der Tabelle zum Zählen verwenden, wenn Du dabei die für Deinen SQL-Dialekt die Behandlung von NULL-Werten berücksichtigst).
Aber ich werd's mal ausprobieren.....
Scheint mir nicht unbedingt der Königsweg zum Lösungsverständnis zu sein...
HTH Robert
Hi Rouven,
ich fürchte das geht aus dem Grunde nicht, weil damit die Anzahl der spiele pro match unberücksichtigt bleibt, das können ja wie gesagt unterschiedlich viele sein, ...
Das sollte gehen da count(dauer) ja auch gruppiert wird, d.h. count(dauer) enthaelt die Anzahl der Spiele je Match-ID.
Koenntest genauso gut count(spiele_id) nehmen (falls Du so eine Spalte hast).
Lass Dir doch mal sum(dauer) und count(dauer) in einzelnen Spalten ausgeben, dann siehst Du am leichtesten, was da rauskommt:
SELECT sum(dauer), count(dauer), sum(dauer)/count(dauer) FROM spiele GROUP BY matchid
Schoenen Tag noch
Tara