JOIN Problem

DirkHo

Erfahrenes Mitglied
Hallo zusammen,

ich bin gerade am Verzweifeln, weil ich meinen JOIN einfach nicht hinbekomme und auch gerade gar nicht mehr weiß wo oben und unten ist.

Und zwar habe ich eine Tabelle, auf die ich zwei Mal zugreifen möchte:

--------------------------------------------------------
| ID | PLZ | STADT | ANZ_BRIEFKAESTEN |
--------------------------------------------------------
| 1 | 123 | 1 | 5000 |
--------------------------------------------------------
| 2 | 124 | 1 | 300 |
--------------------------------------------------------
| 3 | 125 | 1 | 800 |
--------------------------------------------------------
| 4 | 456 | 2 | 450 |
--------------------------------------------------------
| 5 | 457 | 2 | 8000 |
--------------------------------------------------------
| 6 | 789 | 3 | 310 |
--------------------------------------------------------

Es gibt also eine ID, die ersten 3 Ziffern einer PLZ, dazu die Stadt (eine Stadt kann ja mehrere PLZs haben) und eine Anzahl Briefkästen.

Nun will ich folgendes machen:

Alle Briefkästen einer Stadt addieren addieren und dann jeweils schauen, welche Stadtteile/PLZ mehr als 10% der Briefkästen stellt und diese ausgeben lassen.

Bsp.:
STADT: 1
Briefkästen gesamt: 6.100
%ualer Anteil nach PLZ:
- 123: (5.000/6.100)*100 = 82%
- 124: (300/6.100)*100 = 5%
- 125: (800/6.100)*100 = 13%

PLZ 123 hätte mit 82% und PLZ 125 mit 13% mehr als 10% der Briefkästen in ihrem Stadtteil -> die beiden hätte ich dann gerne ausgegeben und das eben für alle Städte, die ich von außen (PHP-Skript) eingebe.

Hier mal mein Versuch, aber der geht gar nicht:

Code:
SELECT 
	a.DST,
	SUM(a.ANZ_BRIEFKAESTEN) as SUMALLEBRIEFK,	
	SUM(b.ANZ_BRIEFKAESTEN) as SUMBRIEFK
FROM
	BRIEFKAESTEN a
INNER JOIN
	BRIEFKAESTEN b
ON
	a.STADT = b.STADT
WHERE
	a.STADT= 1
AND
	(SUMBRIEFK/SUMALLEBRIEFK)*100 > 15
GROUP BY 
	b.PLZ

Hat jemand eine Idee, wie ich das hinbekommen könnte? Das ist nur eine Übung für mich, also keine Sorge wegen Datensammlung auf Kosten von Briefkastenbesitzern ;)

Danke und Grüße,

Dirk
 
EIne Unterabfrage erleichtert es enorm
SQL:
SELECT
	b.plz,
	b.stadt,
	(b.anz_briefkaesten/stadtsum.anz_b_per_stadt)*100 AS prozent
FROM
	briefkaesten AS b
	INNER JOIN (
					SELECT
						stadt
						SUM(anz_briefkaesten) AS anz_b_per_stadt
					FROM
						briefkaesten
					GROUP BY
						stadt
				) AS stadtsum
		ON b.stadt = stadtsum.stadt
 
Zuletzt bearbeitet von einem Moderator:
Hallo yaslaw,

vielen Dank für deine Antwort! Leider funktioniert es noch nicht ganz richtig. Ich habe jetzt noch "etwas" damit rumgespielt und versucht es zum Laufen zu bekommen.

Ein Fehler ist z.B., dass STADTSUM falsch berechnet wird. Irgendwie kommt immer die doppelte Anzahl an Briefkästen raus als wirklich vorhanden sind. Durch die Tatsache und die Tatsache, dass wohl dann die reale Anzahl der Briefkästen durch die doppelte Anzahl der insgesamt vorhandenen geteilt wird kommen dann auch falsche Zahlen raus.

Hat jemand eine Idee, woran das liegen könnte?

Ich habe meinen Query schlussendlich auch noch um ein

Code:
WHERE b.stadt = 5

(also Beispiel) nach dem INNER JOIN erweitert, zum Einen da es schneller geht und zum Anderen, weil ich ja nur zu best. Städten die Zahlen benötige. Was jedoch auch noch nicht geht, wenn ich die WHERE-Klausel um

Code:
(b.pax/stadtsum.anz_b_per_stadt)*100 > 15

erweitere um schlussendlich wirklich nur die PLZs zu bekommen, die mehr als 15% der Briefkästen haben. Wobei das vielleicht auch an der falschen Berechnung im Allgemeinen liegt?!

Hat da jemand eine Idee?

Vielen Dank und viele Grüße,

Dirk
 
Zuletzt bearbeitet:
Es kann nicht sein, dass die satdtsum doppelt gerechnet wird. AUsser du hast da die Stadt mehrfach drin.
Prüfe doch mal das Subquery
SQL:
                    SELECT
                        stadt
                        SUM(anz_briefkaesten) AS anz_b_per_stadt
                    FROM
                        briefkaesten
                    GROUP BY
                        stadt
Sind da die Zaheln auch schon falsch?
 
Zuletzt bearbeitet von einem Moderator:
Hallo yaslaw,

keine Ahnung warum, aber jetzt klappt es auf einmal...

Vielen Dank nochmals und viele Grüße,

Dirk
 
Zurück