Ergebnis 1 bis 4 von 4

SQL: Komplizierte HAVING clause

  1. #1 Zitieren
    Ehrengarde Avatar von Time2Die
    Registriert seit
    Jul 2007
    Ort
    Bei dir
    Beiträge
    2.566
    Gegeben sei eine Relation PLZ.
    Diese hat folgende Attribte: Region, Ort, Plz.

    Wenn ich nun abfragen will, wie viele Orte hat eine Region, frage ich das mit folgendem Befehl ab:
    Query: SELECT Region, COUNT(Plz) AS Anzahl_Orte FROM PLZ GROUP BY Region

    Wie man sieht, bekomme ich auch ein Ergebnis:
    http://abload.de/img/orts_abfrage7psra.png

    Nun will ich aber was probiere, was mich ganz verrückt macht weil ich es nicht schaffe, und zwar ich will nur jene Regionen anzeigen lassen,
    deren Anzahl an Orten über dem Druschnitt liegt, das ginge ungefähr so denk ich mal:

    SELECT Region, COUNT(Ort) AS Anzahl_Orte
    FROM PLZ
    GROUP BY Region
    HAVING COUNT(Ort) > (SELECT AVG(Count(Ort) ) FROM PLZ GROUP BY Region)

    oder so

    SELECT Region, COUNT(Ort) AS Anzahl_Orte
    FROM PLZ
    GROUP BY Region
    HAVING COUNT(Ort) > AVG(SELECT (Count(Ort) ) FROM PLZ GROUP BY Region)

    .... aber nicht davon funzt. Was stimmt mit meiner Having-Klausel nicht?
    Ärger mit Hard- oder Software? Oder willst dir welche zulegen?
    Ab ins PC- und Multimediaforum! (und nicht in die PE )
    Gothic-3-Spielstand gefällig?

    Time2Die ist offline

  2. #2 Zitieren
    Held Avatar von Satans Krümelmonster
    Registriert seit
    Aug 2007
    Beiträge
    5.797
    Wieso HAVING? Macht man sowas nicht mit nem WHERE?

    SELECT Region, COUNT(Ort) AS Anzahl_Orte
    FROM PLZ
    GROUP BY Region
    WHERE COUNT(Ort) > ((SELECT Count(Ort) FROM PLZ)/(SELECT Count(Region) FROM PLZ))

    Hab's nicht getestet, aber so könnte ich mir das vorstellen.
    Satans Krümelmonster ist offline

  3. #3 Zitieren
    Knight Commander Avatar von Kellendil
    Registriert seit
    Jul 2009
    Beiträge
    2.101
    having ist schon richtig.
    Having filtert nach der gruppierung, where filtert vor der gruppierung. Die erste Variante müsste richtig sein:

    SELECT Region, COUNT(Ort) AS Anzahl_Orte
    FROM PLZ
    GROUP BY Region
    HAVING COUNT(Ort) > (SELECT AVG(Count(Ort) ) FROM PLZ GROUP BY Region);

    Was kommt da denn für eine fehlermeldung?
    Kellendil ist offline

  4. #4 Zitieren
    Drachentöter Avatar von Vertaler
    Registriert seit
    Sep 2006
    Beiträge
    4.539
    Code:
    SELECT `Region`, COUNT(`Ort`) AS Anzahl_Orte
    FROM `PLZ`
    GROUP BY `Region`
    HAVING Anzahl_Orte > (
      SELECT AVG(COUNT(`Ort`))
      FROM `PLZ`
      GROUP BY `Region`
    );
    (= im Prinzip das von Kellendil, nur mit Wiederverwendung der bereits berechneten Anzahl_Orte) sollte passen. Das ist nicht ganz das gleiche wie im Eingangsbeitrag: AVG(SELECT COUNT(`Spaltenname`)) ist falsch, es muß SELECT AVG(COUNT(`Spaltenname`)) heißen.
    Es entsteht immer wieder Anlass zu vorsichtiger Lebensfreude, wenn man sich vor Augen hält, was es alles nicht gibt und was es daher vielleicht auch niemals geben wird.

    [Bild: rand.php?p=xkcd&n=3] [Bild: rand.php?p=numminen&n=3] [Bild: rand.php?p=co&n=4] [Bild: rand.php?p=snark&n=3] [Bild: rand.php?p=musik&n=5]
    Vertaler ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •