Humberto: (MySQL) Filterung des Ergebnisses nach SUM

Hallo,

ich versuche gerade, aus einer Tabelle von Ländern diejenigen Länder herauszufiltern, deren Anzahl an Einwohnern, die in Städten mit mehr als 100.000 Einwohnern wohnen, größer als 10.000.000 ist. Die Städte sind in einer Tabelle gespeichert, die folgende relevante Attribute besitzt:

LID - Die ID des Landes, in dem die Stadt liegt
Bevoelkerung - Die Gesamtbevölkerung der Stadt

Ich habe das Problem auf diese Weise zu lösen versucht:

SELECT land.name as land, SUM(stadt.bevoelkerung) as stadtbevoelkerung  
FROM land, stadt  
WHERE stadt.LID = land.LID AND stadt.bevoelkerung > 100000 AND stadtbevoelkerung > 10000000  
GROUP BY land.lid;

Das scheiterte jedoch:

ERROR 1054 (42S22): Unknown column 'stadtbevoelkerung' in 'where clause'

Also versuchte ich es mit SUM(stadt.bevoelkerung) anstelle von stadtbevoelkerung im where-abschnitt, allerdings scheiterte das ebenfalls:

ERROR 1111 (HY000): Invalid use of group function

Lässt sich das Problem überhaupt innerhalb einer Abfrage lösen?

Danke, Humberto

  1. Hello,

    ERROR 1054 (42S22): Unknown column 'stadtbevoelkerung' in 'where clause'
    ERROR 1111 (HY000): Invalid use of group function

    die beiden im Zusammenspiel weisen dich auf den richtigen Weg. SUM ist eine Aggregatsfunktion, sie steht eigentlich* bei einer Gruppierung zur Verfügung. Dementsprechend macht es Sinn, dass du "stadtbevoelkerung" nicht in der WHERE-Klause auswerten kannst, diese wird VOR der Gruppierung ausgewertet.
    Die Lösung:
    HAVING, das die Elemente von Gruppierungen bezeichnet, siehe Manual.

    MfG
    Rouven

    * MySQL ist da bei Aggregatsfunktionen teilweise anderer Meinung als viele andere, aber das ist ein anderes Thema

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    I will never understand why Germans feel the need to kill trees  --  Arbeitskollege aus UK zum Thema ob eine Dokumentation elektronisch oder auf Papier ausgeliefert wird
    1. Super, funktioniert! Vielen Dank.

      Humberto