wie gehen sub-selects?
Marco Weber
- datenbank
hallo,
ich habe ein problem mit subselects, und zwar funktionieren die bei mir nicht, weil mein sql query falsch ist. (ich benutze oracle...)
SELECT e1.stadt, count(e1.name) AS bewohner, (SELECT avg(e2.gehalt) FROM einwohner e2 WHERE e2.region=e1.region) AS durchschnittsgehalt FROM einwohner e1 GROUP BY e1.stadt;
was mache ich falsch?
vielen dank im voraus... :-)
MFG Marco
yo,
SELECT e1.stadt, count(e1.name) AS bewohner, (SELECT avg(e2.gehalt) FROM einwohner e2 WHERE e2.region=e1.region) AS durchschnittsgehalt FROM einwohner e1 GROUP BY e1.stadt;
was mache ich falsch?
auf den ersten blick würde ich sagen, dass die ersten beiden spalten und die dritte spalte underschiedliche anzahl von datensätzen liefern. aber das ist mehr ein bauchgefühl. gib uns doch mal die fehlermeldung und sag uns, was genau du abfragen willst.
Ilja
hallo,
erstmals danke für deine antwort.
Also ich habe eine tabelle wo UNTER ANDEREM folgende spalten enthalten sind:
vorname - vorname der person - varchar
name - nachname der person - varchar
stadt - Stadtname - varchar
region - Regionname - varchar
bundesstaat - Bundeslandkürzel - varchar
gehalt - gehalt der person - decimal
somit sieht also eine zeile / ein eintrag wie folgt aus:
[...], Marco, Weber, [...], lalastadt, lalaregion, RLP, 10.1, [...]
(die [...] stellen noch weitere spalten dar, die aber für mein query irrelevant sind)
was ich nun für jede stadt wissen will, ist (hierbei gilt zu beachten, dass es gleichen städtnamen in verschiedenen regionen gibt):
Wie muss da mein SQL query aussehen?
ich bin da am probieren und probieren und es kommt einfach nix gescheites raus... :-(
vielen dank für eure hilfe im voraus...
yo,
ich bin da am probieren und probieren und es kommt einfach nix gescheites raus... :-(
das wird schon was werden, kopf hoch....
mein erster vorschlag wäre, dein datenbank-desgin zu überdenken. region und bundesstaat könnte man auch ausgliedern. von der stadt kann man die region ableiten und von der region das bundesland. die städte könnten eine eindeutige id bekommen, und somit können sich auch gleiche namen besitzen. aber das ist mehr oder weniger geschmackssache, ich würde es dir aber anraten.
nun zu deinen abfragen. du hast einen falschen ansatz. group by ist dein freund und mehrere abfragen. keep it simple (kis), ich würde nicht versuchen, alles in eine zu packen.
SELECT COUNT(*) AS Einwohnerzahl AVG(gehalt) AS Gehalt, stadt, region, bundesstaat
FROM tabelle
GROUP BY stadt, region, bundestaat
SELECT AVG(gehalt) AS Gehalt, region
FROM tabelle
GROUP BY region
SELECT AVG(gehalt) AS Gehalt, bundesstaat
FROM tabelle
GROUP BY bundesstaat
SELECT AVG(gehalt)
FROM tabelle
so, das sind erst einmal die abfragen. nun kan man sicherlich daran basteln, dass alles in eine query zu bekommen. aber muss man das, bzw. ist das eine vorgabe von dir ?
Ilja
- die einwohnerzahl der stadt ( bzw. erfasste personen in der stadt)
- das durchschnittsgehalt der stadt
SELECT COUNT(*) AS Einwohnerzahl AVG(gehalt) AS Gehalt, stadt, region, bundesstaat
FROM tabelle
GROUP BY stadt, region, bundestaat
- das durchschnittsgehalt der region
SELECT AVG(gehalt) AS Gehalt, region
FROM tabelle
GROUP BY region
- das durchschnittsgehalt des bundeslandes
SELECT AVG(gehalt) AS Gehalt, bundesstaat
FROM tabelle
GROUP BY bundesstaat
- das durchschnittsgehalt landesweit
SELECT AVG(gehalt)
FROM tabelle
Vielmals danke für die einzelen queries! :-)
aber was ich bräuchte wäre ein einzelnes query...
und da komm ich einfach nicht weiter... :-(
kannst du mir damit vielleicht etwas weiterhelfen?
MFG Marco
yo,
aber was ich bräuchte wäre ein einzelnes query...
und da komm ich einfach nicht weiter... :-(
unterabfragen machen es in dem falle langsamer und komplizierter als mehrere abfragen. aber ein versuch könnte sein.
SELECT COUNT(*) AS Einwohnerzahl AVG(gehalt) AS Gehalt,
stadt, region, bundesstaat,
(SELECT AVG(gehalt) FROM tabelle tb2
WHERE tb1.region=tb2.region) "Durschnitt Region",
(SELECT AVG(gehalt) FROM tabelle tb3
WHERE tb1.bundesstaat=tb3.bundesstaat) "Durschnitt Bundesland",
(SELECT AVG(gehalt) from tabelle tb4) "Durchschnitt Gesamt"
FROM tabelle tb1
GROUP BY stadt, region, bundestaat
habe hier bei mir kein oracle und auch keine unterlagen, sprich kann es nicht ausprobieren auf syntax oder sematnik.
Ilja
VIELEN VIELEN DANK! :-)
Das läuft perfekt!
...und hab schon wieder ein klein wenig über sub-selects gelernt!
SELECT COUNT(*) AS Einwohnerzahl AVG(gehalt) AS Gehalt,
stadt, region, bundesstaat,
(SELECT AVG(gehalt) FROM tabelle tb2
WHERE tb1.region=tb2.region) "Durschnitt Region",
(SELECT AVG(gehalt) FROM tabelle tb3
WHERE tb1.bundesstaat=tb3.bundesstaat) "Durschnitt Bundesland",
(SELECT AVG(gehalt) from tabelle tb4) "Durchschnitt Gesamt"
FROM tabelle tb1
GROUP BY stadt, region, bundestaat