Ralf: Problem mit doppelten Datensätzen...

Liebe Experten,

in einer von mir übernommenen Datenbank möchte ich Datensätze mit identischer Kundennummer, die mehr als einmal vorkommen und die in der Spalte "system" unterschiedliche Einträge haben ermitteln.

Aufbau der Datenbank:

kundennummer | kundenname | datum                 | system
----------------------------------------------------------
111999       | Ernie      | 2012-06-26 11:29:50   | Test1
111999       | Bert       | 2012-06-26 11:29:50   | Test1
111999       | Krümel     | 2012-06-26 11:29:50   | Test2

Ermittelt werden sollen nur die Datensätze mit identischer Kundennummer und(!) unterschiedlichem system. In diesem Fall also der 1. und 3. Eintrag.

Mein Ansatz liefert mir leider nur systemübergreifende Resultate und ich weiß nicht, ob der Ansatz mit der having-Klausel tatsächlich der richtige ist:

"SELECT COUNT(kundennummer) AS anzahl, kundenname, system FROM kunden GROUP BY kundennummer
HAVING (COUNT(kundennummer) > 1) ORDER by kundennummer ASC"

Im Prinzip müßte der Ansatz irgendwie mit "WHERE kundennummer != kundennummer"
lauten- was allerdings kein gültiger Syntax zu sein scheint.

Daher meine Frage:
Geht diese Abfrage überhaupt in dieser vereinfachten Form, falls ja, mit WHERE oder having oder wie müßte der Aufbau aussehen um das gewünschte Resultat zu erreichen?

Ich habe den halben Tag herumprobiert, aber über o.g. Beispiel bin ich nicht binaus gekommen...

  1. Hi,

    Mein Ansatz liefert mir leider nur systemübergreifende Resultate

    Soll heissen?

    und ich weiß nicht, ob der Ansatz mit der having-Klausel tatsächlich der richtige ist:

    "SELECT COUNT(kundennummer) AS anzahl, kundenname, system FROM kunden GROUP BY kundennummer
    HAVING (COUNT(kundennummer) > 1) ORDER by kundennummer ASC"

    Wenn du nach Kundennummer gruppierst, haben die anderen Felder nichts in der Query verloren. (Spalten zu selektieren, über die nicht gruppiert wird, ist in SQL ein Fehler – MySQL verzeiht ihn üblicherweise, liefert aber zufällige Ergebnisse für diese Spalten.)

    Im Prinzip müßte der Ansatz irgendwie mit "WHERE kundennummer != kundennummer"
    lauten- was allerdings kein gültiger Syntax zu sein scheint.

    Natürlich ist das gültige Syntax – aber „ungültige Realität“. Du wirst nie einen Datensatz finden, in dem der Wert einer Spalte nicht gleich seiner selbst ist (zumindest solange tatsächlich ein Wert vorliegt, und du keinen Quantencomputer hast).

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. Tach!

    kundennummer | kundenname | datum                 | system

    111999       | Ernie      | 2012-06-26 11:29:50   | Test1
    111999       | Bert       | 2012-06-26 11:29:50   | Test1
    111999       | Krümel     | 2012-06-26 11:29:50   | Test2

    Ermittelt werden sollen nur die Datensätze mit identischer Kundennummer und(!) unterschiedlichem system. In diesem Fall also der 1. und 3. Eintrag.

    Warum der 1 und 3. und nicht der 2. und 3.? Welches auswertbare Kriterium kannst du zur Unterscheidung heranziehen?

    Mein Ansatz liefert mir leider nur systemübergreifende Resultate und ich weiß nicht, ob der Ansatz mit der having-Klausel tatsächlich der richtige ist:

    "SELECT COUNT(kundennummer) AS anzahl, kundenname, system FROM kunden GROUP BY kundennummer
    HAVING (COUNT(kundennummer) > 1) ORDER by kundennummer ASC"

    Das Gruppieren über die Kundennummer ist schon richtig. Nicht ganz richtig ist, Felder abzufragen, über die du nicht gruppierst, weil du damit unter MySQL irgendeinen Inhalt bekommst und in anderen Systemen eine Fehlermeldung. Jedenfalls bekommst du durch die Gruppierung alle Datensätze mit derselben Kundennummer zusammengefasst. Eigentlich willst du nun wissen, ob es darunter welche mit unterschiedlichem System gibt. Du kannst das im HAVING zählen mit COUNT(DISTINCT). In der SELECT-Klausel brauchst du nur die Kundennummer. Mit einer zweiten Query, oder auch die erste als Subquery zu dieser zweiten) kannst du nun alle Datensätze mit den ermittelten Kundennummern abfragen.

    Weitere Optionen kommen darauf an, welche Daten du letzlich brauchst. Du könntest in der äußeren/zweiten Query nur die Felder kundennummer und system abfragen und ein SELECT DISTINCT verwenden, dann hast du zwar die gewünschte Einschränkung auf zwei Zeilen, deinem Beispiel gemäß, aber davon kommst du nicht mehr an die genauen Datensätze, weil dir dann eine ID fehlt, die aber einen Strich durch das DISTINCT macht.

    Im Prinzip müßte der Ansatz irgendwie mit "WHERE kundennummer != kundennummer"
    lauten- was allerdings kein gültiger Syntax zu sein scheint.

    Wieso "scheint"? Wenn es keine gültige Syntax wäre, bekämest du eine entsprechende Fehlermeldung. Du bekommst nur kein Ergebnis, weil die Bedingung nie zutrifft. Der SQL-Server wendet die Bedingung auf einen einzelnen Datensatz an und berücksichtigt dabei nicht die anderen Datensätze. Das WHERE wird auch vor den GROUP BY ausgeführt, bezieht sich also auch nicht auf die gruppierten sondern alle (einzelnen) Datensätze.

    dedlfix.