Klaus: Problem bei MySQL-Abfrage

Hallo,

ich möchte eine etwas kompliziertere Abfrage erstellen:

In einer Tabelle gibt es die beiden Felder 'empfohlen' und 'beauftragt', die beide eine Kundennummer enthalten können. Ein weiteres Feld 'fertig' gibt an, ob der Auftrag noch offen ist oder nicht. Dabei kann das Feld 'beauftragt' noch leer sein und es kann sein, dass die Kundennummer in 'empfohlen' eine andere ist als im 'beauftragt'. In einer 2. Tabelle stehen die der Kundennummer zugehörigen Kontaktdaten wie z.B. Name etc.

Wie kann ich die Anzahl Einträge pro Kundennummer zählen, bei dem er entweder in 'beauftragt' steht oder in 'empfohlen' wenn 'beauftragt' noch leer ist? Dabei soll über die 2. Tabelle auch der Name angezeigt werden.

Bisher zähle ich leider nur die Kundennummer, die in 'empfohlen' stehen.

SELECT count(*) as anz,a.empfohlen,b.kdnr,b.name FROM auftraege as a left join stamm as b on a.empfohlen = b.kdnr WHERE fertig = '' GROUP BY empfohlen order by anz DESC

Wenn bspw. Kunde 1 empfohlen ist, aber Kunde 2 den Auftrag übernimmt, dann zähle ich bei Kunde 1 einen zuviel und bei Kunde 2 einen zuwenig.

Hat jemand eine Idee, wie ich das korrekt lösen könnte?

Klaus

akzeptierte Antworten

  1. Tach!

    Wie kann ich die Anzahl Einträge pro Kundennummer zählen, bei dem er entweder in 'beauftragt' steht oder in 'empfohlen' wenn 'beauftragt' noch leer ist?

    MySQL gestattet in Abweichung vom SQL-Standard auch die Verwendung von Ausdrücken in der GROUP-BY-Klausel. Ich selbst hab das noch nicht gemacht, aber du kannst ja mal versuchen, einen Ausdruck zu erstellen, der die Kundennummer liefert. Funktionen wie IF() oder IFNULL() sollten dabei helfen.

    Dabei soll über die 2. Tabelle auch der Name angezeigt werden.

    Der kann in der SELECT-Klausel mithilfe einer Correlated Subquery ermittelt werden.

    dedlfix.

    1. MySQL gestattet in Abweichung vom SQL-Standard auch die Verwendung von Ausdrücken in der GROUP-BY-Klausel. Ich selbst hab das noch nicht gemacht, aber du kannst ja mal versuchen, einen Ausdruck zu erstellen, der die Kundennummer liefert. Funktionen wie IF() oder IFNULL() sollten dabei helfen.

      Kannst Du mir vielleicht eine Quelle mit Beispielen nennen oder wonach ich bei Google suchen könnte? Im Moment hab ich keine Idee, wie das aussehen soll.

      Dabei soll über die 2. Tabelle auch der Name angezeigt werden.

      Der kann in der SELECT-Klausel mithilfe einer Correlated Subquery ermittelt werden.

      Ich habe noch nicht verstanden, wie ich bei einem Entweder/Oder mal das eine oder mal das andere Feld verwende, um in der 2. Tabelle nach dem Namen zu suchen.

      Klaus

      1. Tach!

        Kannst Du mir vielleicht eine Quelle mit Beispielen nennen oder wonach ich bei Google suchen könnte? Im Moment hab ich keine Idee, wie das aussehen soll.

        ... GROUP BY IF(beauftragt gleich leer, Feld empfohlen, Feld beauftragt) ...

        oder mit IFNULL statt IF, wenn du NULL in den Feldern stehen hast und nicht etwa 0 oder Leerstring:

        IFNULL(Feld beauftragt, Feld empfohlen)

        dedlfix.

        1. Vielen Dank!

          ... GROUP BY IF(beauftragt gleich leer, Feld empfohlen, Feld beauftragt) ...

          Jetzt habe ich es verstanden. Ich hatte zunächst befürchtet, dass der Group by nicht richtig funktionieren würde, wenn zwar inhaltlich gleich aber unterschiedliche Felder verwendet werden.

          Funktioniert jetzt einwandfrei! Nochmals vielen Dank.

          Klaus