Juergen: SUM nur einen Eintrag addieren, wenn doppelt

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

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

    --
    Es gibt nichts Gutes, außer man tut es
    Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
    1. 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

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

        --
        Es gibt nichts Gutes, außer man tut es
        Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
      2. 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

        --
        Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.
        Toller Dampf voraus von Terry Pratchett
  2. 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.

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