Mehrere Durchschnitte in einer Tabelle ausgeben

Jolies

Neuer Benutzer
Beiträge
3
Hallo zusammen. =)
Ich bin noch relativ neu und unerfahren was SQL angeht und ich habe ein paar Aufgaben, bei denen ich einfach nicht weiterkomme. Es geht darum, dass ich eine Tabelle habe in der mehrere Personen, deren Stadt, Bundesstaat und Land aufgelistet sind. Ich soll jetzt die Anzahl der Bewohner und ihr durchschnittliches Einkommen pro Stadt, Bundesland und des gesamten Landes in einer Tabelle ausgeben. Der Teil mit "in einer Tabelle" macht mir schwierigkeiten..
Nur nach Staat zB ist ja einfach:

Code:
SELECT e.Staat, AVG(e.Einkommen)AS Einkommen
FROM Einwohner e
GROUP BY e.Staat

Aber wie gebe ich aus einer Tabelle mehrere Durchschnitte nach unterschiedlichen Spalten sortiert aus?
Mir reicht es, wenn mir jemand den korrekten Befehl sagen könnte, ich kann danach selber im Internet suchen, wie der genutzt wird und wie ich eventuelle Nullstellen rauskürze usw, aber es fehlt mir einfach der Ansatz. =(
Ich hoffe ich hab mich zumindest halbwegs klar ausgedrückt. ;)

Allerliebste Grüße
Jolies
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.160
Hallo zusammen. =)
Ich bin noch relativ neu und unerfahren was SQL angeht und ich habe ein paar Aufgaben, bei denen ich einfach nicht weiterkomme. Es geht darum, dass ich eine Tabelle habe in der mehrere Personen, deren Stadt, Bundesstaat und Land aufgelistet sind. Ich soll jetzt die Anzahl der Bewohner und ihr durchschnittliches Einkommen pro Stadt, Bundesland und des gesamten Landes in einer Tabelle ausgeben. Der Teil mit "in einer Tabelle" macht mir schwierigkeiten..
Nur nach Staat zB ist ja einfach:

Code:
SELECT e.Staat, AVG(e.Einkommen)AS Einkommen
FROM Einwohner e
GROUP BY e.Staat

Aber wie gebe ich aus einer Tabelle mehrere Durchschnitte nach unterschiedlichen Spalten sortiert aus?
Mir reicht es, wenn mir jemand den korrekten Befehl sagen könnte, ich kann danach selber im Internet suchen, wie der genutzt wird und wie ich eventuelle Nullstellen rauskürze usw, aber es fehlt mir einfach der Ansatz. =(
Ich hoffe ich hab mich zumindest halbwegs klar ausgedrückt. ;)

Allerliebste Grüße
Jolies


Ich weiß, was Du suchst, und kann Dir auch sagen, wie es geht, aber das geht wahrscheinlich NICHT mit MySQL.

Also, folgende Tabelle:

Code:
test=*# select * from einkommen ;
  stadt  |  bundesland  |    land    | einkommen
-----------+----------------+-------------+-----------
dresden  | sachsen        | deutschland |      3000
meissen  | sachsen        | deutschland |      2800
chemnitz  | sachsen        | deutschland |      2900
erfurt    | thueringen    | deutschland |      3100
paris    | paris          | frankreich  |      2600
magdeburg | sachsen-anhalt | deutschland |      2900
(6 rows)

Was Du wohl suchst ist folgendes:

Code:
test=*# select stadt, bundesland, land, avg(einkommen) over (partition by land, bundesland,stadt) as per_stadt, avg(einkommen) over (partition by land, bundesland) as per_bundesland, avg(einkommen) over (partition by land) as per_land from einkommen;
  stadt  |  bundesland  |    land    |      per_stadt      |    per_bundesland    |      per_land
-----------+----------------+-------------+-----------------------+-----------------------+-----------------------
chemnitz  | sachsen        | deutschland | 2900.0000000000000000 | 2900.0000000000000000 | 2940.0000000000000000
dresden  | sachsen        | deutschland | 3000.0000000000000000 | 2900.0000000000000000 | 2940.0000000000000000
meissen  | sachsen        | deutschland | 2800.0000000000000000 | 2900.0000000000000000 | 2940.0000000000000000
magdeburg | sachsen-anhalt | deutschland | 2900.0000000000000000 | 2900.0000000000000000 | 2940.0000000000000000
erfurt    | thueringen    | deutschland | 3100.0000000000000000 | 3100.0000000000000000 | 2940.0000000000000000
paris    | paris          | frankreich  | 2600.0000000000000000 | 2600.0000000000000000 | 2600.0000000000000000
(6 rows)

Das wird aber so wohl nicht mit MySQL gehen, das geht mit PostgreSQL (verwende ich), und wohl auch in Oracle und M$SQL, vielleicht auch Informix und anderen Systemen.

Was Du machen kannst: das, was Du oben schon hast, das aber mehrfach je Kriterium und die Ausgaben via UNION ALL verketten. Denk ich mal, ungetestet...
 

akretschmer

Datenbank-Guru
Beiträge
9.160
Ich weiß, was Du suchst, und kann Dir auch sagen, wie es geht, aber das geht wahrscheinlich NICHT mit MySQL.



Was Du machen kannst: das, was Du oben schon hast, das aber mehrfach je Kriterium und die Ausgaben via UNION ALL verketten. Denk ich mal, ungetestet...


Irknwie sowas vielleicht:

Code:
test=*# select stadt, bundesland, land, avg(einkommen) per_stadt,null::numeric as per_bundesland,null::numeric as per_land from einkommen group by 1,2,3,5,6 union all select null, bundesland, land, null, avg(einkommen) as per_stadt,null from einkommen group by 1,2,3 union all select '','',land, null,null,avg(einkommen) from einkommengroup by 1,2,3;
   stadt   |   bundesland   |    land     |       per_stadt       |    per_bundesland     |       per_land
-----------+----------------+-------------+-----------------------+-----------------------+-----------------------
 meissen   | sachsen        | deutschland | 2800.0000000000000000 |                       |
 dresden   | sachsen        | deutschland | 3000.0000000000000000 |                       |
 erfurt    | thueringen     | deutschland | 3100.0000000000000000 |                       |
 chemnitz  | sachsen        | deutschland | 2900.0000000000000000 |                       |
 paris     | paris          | frankreich  | 2600.0000000000000000 |                       |
 magdeburg | sachsen-anhalt | deutschland | 2900.0000000000000000 |                       |
           | sachsen-anhalt | deutschland |                       | 2900.0000000000000000 |
           | sachsen        | deutschland |                       | 2900.0000000000000000 |
           | paris          | frankreich  |                       | 2600.0000000000000000 |
           | thueringen     | deutschland |                       | 3100.0000000000000000 |
           |                | frankreich  |                       |                       | 2600.0000000000000000
           |                | deutschland |                       |                       | 2940.0000000000000000
(12 rows)

Andreas
 

Jolies

Neuer Benutzer
Beiträge
3
Mir ist auch gerade aufgefallen, dass ich am falschen Ort bin.. Ich wollte eigentlich zu Oracle.. Kann ein Mod den Thread bitte verschieben? Wie doof von mir. =\
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.409
Du kannst auch die selbe Tabele mehrmals mit sich selbst joinen, das sollte auch das gewünschte Ergebnis erzielen. Allerdings verstehe ich die Aufgabe noch nicht ganz: Willst du jetzt Anzahl der Personen pro Stadt, pro Bundesland und pro Land ausgeben oder was ist die Ausgangsinformation? Kannst du vieleicht mal Beispieldaten posten?
 
Oben