Ich bin neu in SQL und habe Schwierigkeiten mit dieser Abfrage:

Die durchschnittliche Höhe jedes Landkreises in Texas, der eine oder mehrere Postleitzahlen mit mehr als 20.000 Einwohnern enthält.

Das habe ich bisher:

SELECT county, zip_code, state, AVG(elevation) 
FROM zip_codes 
WHERE state=’TX’  
GROUP BY county 
HAVING population > 20000 
ORDER BY county;

FEHLER 1054 (42S22): Unbekannte Spalte '' TX '' in 'where-Klausel'

Aber wenn ich state aus der zip_codes Datenbank auswähle, ist es da.

1
tobylol 22 Feb. 2020 im 22:04

4 Antworten

Beste Antwort

Die Behebung der Angebotsprobleme ist ein Muss, wie von Littlefoot beantwortet.

Ihre Abfrage ist jedoch immer noch ungültig, da:

  • Die select -Klausel enthält zwei nicht aggregierte Spalten, die nicht Teil der group by -Klausel sind (zip_code und state).

  • Gleiches gilt für die Spalte population in der having -Klausel, die weder aggregiert noch Teil der group by -Klausel ist

Für diese Aufgabe:

Die durchschnittliche Höhe jedes Landkreises in Texas, der eine oder mehrere Postleitzahlen mit mehr als 20.000 Einwohnern enthält.

Angenommen, jeder Datensatz in der Tabelle entspricht einer anderen Postleitzahl (was relevant erscheint, da die Tabelle selbst zip_codes heißt), könnten Sie Folgendes formulieren:

select county, state, avg(elevation) avg_elevation
from zip_codes 
where state= 'TX'  
group by county, state 
having max(population) > 20000 
order by county;
1
GMB 22 Feb. 2020 im 21:02

Ohne ein Datenmuster ist es schwierig, genau zu verstehen, was los ist, aber ich werde es versuchen.

Ihre Aufgabe besagt, dass Sie "die durchschnittliche Höhe jedes Landkreises in Texas berechnen müssen, der eine oder mehrere Postleitzahlen mit einer Bevölkerung von über 20.000 enthält". Lassen Sie uns die Elemente der Aufgabe aufschlüsseln, die Sie finden müssen:

Average elevation
  Of each county in Texas
    Which has one or more zip code
      With population > 20,000

Und wir haben eine Tabelle mit Postleitzahlen mit Landkreis, Bundesland und Höhe.

Also, OK - erstes Problem: Finde alle Postleitzahlen in Texas:

SELECT *
  FROM ZIP_CODES
  WHERE STATE = 'TX'

OK, soweit einfach. Beschränken Sie sich jetzt auf Postleitzahlen mit mehr als 20.000 Einwohnern:

SELECT *
  FROM ZIP_CODES
  WHERE STATE = 'TX' AND
        POPULATION > 20000

Cool - aber das gibt uns einen Eintrag für jede Postleitzahl in der Grafschaft mit einer Bevölkerung> 20000. Alles, was uns interessiert, sind die einzelnen Landkreise, die mindestens eine Postleitzahl mit einer Bevölkerung über 20.000 haben. Wie wäre es also?

SELECT DISTINCT COUNTY
  FROM ZIP_CODES
  WHERE STATE = 'TX' AND
        POPULATION > 20000

Toll. Jetzt müssen wir die durchschnittliche Höhe in jedem Landkreis berechnen, die von der obigen Abfrage zurückgegeben wird:

SELECT COUNTY, AVG(ELEVATION)
  FROM ZIP_CODES
  WHERE STATE = 'TX' AND
        COUNTY IN (SELECT DISTINCT COUNTY
                     FROM ZIP_CODES
                     WHERE STATE = 'TX' AND
                           POPULATION > 20000)
  GROUP BY COUNTY
  ORDER BY COUNTY

Und da ist deine Antwort.

0
Bob Jarvis - Reinstate Monica 22 Feb. 2020 im 21:55
SELECT county, zip_code, state, AVG(elevation) 
FROM zip_codes 
WHERE state='TX'
GROUP BY county,  zip_code, state 
where population > 20000 
ORDER BY county;
0
Deepika 22 Feb. 2020 im 19:34

Sie verwenden falsche einfache Anführungszeichen. Sollte sein

WHERE state = 'tx'

Anstatt von

WHERE state = ’tx’

Ihre sind ... woher? Einige Editoren wie MS Word oder ähnliches, die diese "ausgefallenen" Zitate erstellen. Verwenden Sie sie nicht.

Abgesehen davon sollten nicht aggregierte Spalten alle Teil der GROUP BY -Klausel sein:

group by county, zip_code, state
3
Littlefoot 23 Feb. 2020 im 07:08