Marco Weber: wie gehen sub-selects?

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

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

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

      • die einwohnerzahl der stadt ( bzw. erfasste personen in der stadt)
      • das durchschnittsgehalt der stadt
      • das durchschnittsgehalt der region
      • das durchschnittsgehalt des bundeslandes
      • das durchschnittsgehalt landesweit

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

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

        • 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

        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

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

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