SUM nur einen Eintrag addieren, wenn doppelt
Juergen
- datenbank
- mysql
- sql
Eigentlich funktioniert meine Abfrage gut...
SELECT count(ort) AS anzahl, sum(einwohner) AS menschen, gemeinde,ort FROM tabelle GROUP BY gemeinde ORDER BY gemeinde ASC
in jedem Datensatz habe ich
gemeinde, plz, ort, Einwohner
Abtenau 4001 Dorf 100
Abtenau 4002 Dorf 100
Abtenau 4003 Schorn 100
Abtenau 4004 Rigaus 100
Manchmal ist der Ort Doppelt. Das hat damit zu tun weil es für den Ort noch eine Postleitzahl gibt. Wenn ich die Summer der Einwohner zusammenaddiere, soll die Einwohnerzahl nur einmal hergenommen werden, wenn der Ort doppelt in der Tabelle steht
Wie kann ich das Problem lösen?
Jürgen
Hello,
in jedem Datensatz habe ich
gemeinde, plz, ort, Einwohner Abtenau 4001 Dorf 100 Abtenau 4002 Dorf 100 Abtenau 4003 Schorn 100 Abtenau 4004 Rigaus 100
Manchmal ist der Ort Doppelt. Das hat damit zu tun weil es für den Ort noch eine Postleitzahl gibt. Wenn ich die Summer der Einwohner zusammenaddiere, soll die Einwohnerzahl nur einmal hergenommen werden, wenn der Ort doppelt in der Tabelle steht
Und welcher von beiden (mehreren) Einträgen soll genommen werden? Das muss man dem DBMS sicherlich sagen?!
Als Stichworte würden mir spontan einfallen "Gruppieren über Max()"
Liebe Grüße
Tom S.
Und welcher von beiden (mehreren) Einträgen soll genommen werden? Das muss man dem DBMS sicherlich sagen?!
das ist egal, weil der Eintrag bei Einwohner doppelt ist
Hello,
Und welcher von beiden (mehreren) Einträgen soll genommen werden? Das muss man dem DBMS sicherlich sagen?!
das ist egal, weil der Eintrag bei Einwohner doppelt ist
Das ist mMn äußerst unsicher. Wenn mal einer der Datensätze mit haupsächlich redundanten Daten nicht vollständig ist und zufällig ausgewählt wird, dann stimmen die Zahlen nachher nicht.
So ungefähr haben wohl in den letzten Monaten die Wahlprognostizierer gearbeitet ;-P
Liebe Grüße
Tom S.
Hallo
Und welcher von beiden (mehreren) Einträgen soll genommen werden? Das muss man dem DBMS sicherlich sagen?!
das ist egal, weil der Eintrag bei Einwohner doppelt ist
Das ist nicht egal. Du hast Orte mit mehreren Postleitzahlen und du hast Postleitzahlen, zu denenmehrere Orte gehören. Das ist die von dedlfix angesprochene m:n-Beziehung. Du selbst hast Orte als problematisch angesprochen, die mehrere PLZ haben und deshalb mehrfach mit ihrer Einwohnerzahl aufgelistet werden. Die Orte sollten, unabhängig von ihrer PLZ, eine eindeutige ID haben, mit der sie selektierbar sind.
Tschö, Auge
Tach!
Manchmal ist der Ort Doppelt. Das hat damit zu tun weil es für den Ort noch eine Postleitzahl gibt.
Dann sind die Daten nicht ordentlich normalisiert. Postleitzahl ist in dem Fall mindestens eine 1:n-Beziehung, oder auch m:n (in .de zumindest). Das solllte auch so abgebildet werden, dann sind da von selbst keine Redundanzen bei den Einwohnerzahlen vorhanden.
Wenn ich die Summer der Einwohner zusammenaddiere, soll die Einwohnerzahl nur einmal hergenommen werden, wenn der Ort doppelt in der Tabelle steht
Wenn das so redundant bleiben soll, brauchst du erstmal einen Mechanismus, der die Zeilen findet, die du haben möchtest. Gruppieren kommt da sofort in den Sinn - aber als nicht besonders geeignetes Mittel. Denn welcher Datensatz aus der Menge der Gruppe soll im Ergebnis zu stehen kommen? DISTINCT ist nicht besser. Das sind aber die beiden Möglichkeiten, die mir einfallen, um solche Probleme mit ungünstigen Datenstrukturen zu erschlagen.
Eine blauäugige Variante wäre noch, den Durchschnittswert zu nehmen.
dedlfix.
Spontan fällt mir da 68782 Brühl (bei Heidelberg) und 50321 Brühl (bei Köln) ein...
Wenn Du sicher bist, dass die Duplikate die gleiche Einwohnerzahl haben, und gleiche Einwohnherzahl ein Duplikat bedeutet, könntest Du einen GROUP BY nach Ortsname plus Einwohnerzahl verwenden und das als Table-Expression in einen FROM hineingeben. Aber vermutlich ist auch das nicht 100% sicher.
Du solltest eine Tabelle heranziehen, die für Orte mit mehr als einer PLZ so etwas wie eine Master-PLZ liefert. Keine Ahnung, ob es bei der Post dafür was zum Downloaden gibt. Das wäre die von Auge angesprochene ID.
Rolf