Announcement

Collapse
No announcement yet.

Doppelte Werte mit count nur einmal zählen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Doppelte Werte mit count nur einmal zählen

    Hallo,

    ich bekomme eine Abfrage mit SQL nicht hin. Vielleicht sehe ich den Wald vor lauter Bäumen nicht mehr, aber ich schaffe es einfach nicht. Hier mal der Sachverhalt.

    Es gibt eine Tabelle "Person" und eine Tabelle "Liegenschaften". Personen können mit beliebig vielen Liegenschaften handeln; zwischen den beiden Tabellen besteht eine n:m-Beziehung, die über die Tabelle "Vertrag" läuft. Nun kann eine Person mit einer Liegenschaft handeln und kann später irgendwann noch einmal mit derselben Liegenschaft handeln. Die Person kann eine Liegenschaft z.B. kaufen und später verkaufen und noch einmal später wieder kaufen. Über die Art des Geschäfts habe ich keine Informationen - ich weiß nur, dass die Person mit der Liegenschaft gehandelt hat. Anmerkung: Es geht um eine Datenbank für die mittelalterliche Geschichte, also fehlen diese Informationen meist.

    Hier die Tabellen mit den relevanten Feldern:

    Person = personId, name
    Vertrag = vertragId, personID_fk, liegenschaftId_fk
    Liegenschaft = liegenschaft_id, name

    Jetzt brauche ich eine Abfrage, die mir anzeigt, mit wie vielen Liegenschaften eine Person gehandelt hat. Dabei darf eine Liegenschaft aber nur einmal gezählt werden. Wenn also Person A mit den Liegenschaften X, Y, Z und X gehandelt hat (also vier Einträge in Vertrag), darf als Ergebnis nur 3 angezeigt werden, da die Liegenschaft X nur einmal gezählt werden darf.

    Bei dieser Anweisung werden allerdings Liegenschaften doppelt gezählt:

    select p.personid, name, count(vertragId) from person p, vertrag v where p.personId = v.personId group by personId

    Kann ich die Abfrage so modifizieren, dass dieselben Liegenschaften bei einer Person nur einmal gezählt werden?

    Vielen Dank im Voraus,

    Christopher

  • #2
    Probier mal count(DISTINCT vertragID) aus

    Comment


    • #3
      Hallo,
      Originally posted by Christopher Olbertz View Post
      ...Bei dieser Anweisung werden allerdings Liegenschaften doppelt gezählt:

      select p.personid, name, count(vertragId) from person p, vertrag v where p.personId = v.personId group by personId
      Diese Abfrage ist auch syntaktisch falsch! In der GROUP BY-Klausel müssen ALLE Felder aus der SELECT-Klausel angegeben werden, die nicht aggregiert sind. In dem konkreten fall fehlt also p.name im GROUP BY.
      Wenn es dann auch noch um die beschriebenen Tabellen geht, dann ist auch noch ein weiterer Fehler drin: Das Feld v.personId gibt es nicht. Dies müßte (lt. Beschreibung) v.personID_fk heißen! Also bitte bei der Angabe von Beispielen auf Korrektheit und Konsistenz achten, sonst sucht ein Helfer u.U. an der völlig falschen Stelle!
      Die eigentliche Lösung ist jedoch das von ebis bereits genannte DISTINCT im COUNT. Dies zählt dann nur die unterschiedlichen Einträge.
      Wenn man dann auch noch den Join explizit formuliert und die Tabellenaliase konsequent verwendet, dann würde es komplett so aussehen:
      [highlight=sql]
      select p.personid, p.name, count(distinct v.vertragId)
      from person p
      inner join vertrag v on v.personID_fk = p.personId
      group by p.personId, p.name
      [/highlight]

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment

      Working...
      X