Rouven: AVG, SUM, GROUP BY -> Abfrage?

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

--

-------------------
ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  1. 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

    --

    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  2. 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

    1. 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

      --

      -------------------
      ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
      1. 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

        1. 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

          --

          -------------------
          ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
          1. 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

          2. 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