Knud: (MySQL) wiedermal ein spezielles select-Problem

Hi,

hab mal wieder ein spezielles select-Problem, wo ich nicht weiterkomme.

In einer Tabelle buchen täglich zahlreiche Personen. Jeder aber in der Regel nur ein einziges Mal pro Tag.
Ab und zu bucht aber doch mal einer zweimal oder mehr an einem Tag.
Nun möchte ich genau diese Fälle zählen.
Soll heissen, wie oft kommt es vor, dass eine Person an einem Tag mehr als einmal bucht?
Die Personen identifizieren sich über die Personalnummer. Das Datum ist sinnvollerweise auch gespeichert.
Hat da jemand eine Idee?

Mit dankesvollen Grüßen,

Knud

  1. Hi Knud,

    Nun möchte ich genau diese Fälle zählen.

    1. Gruppieren über Person und Datum (muß auf ganzen Tag gerundet sein)
    2. Zusatzspalte mit count(*) zum Zählen der Buchungen
    3. danach über letztere mit WHERE filtern (Werte > 1 sind die gesuchten)

    Viele Grüße
          Michael

    1. Moin!

      oder so:-)

      1. Gruppieren über Person und Datum (muß auf ganzen Tag gerundet sein)

      Wie gruppiere ich denn über 2 Felder? Einfach GROUP BY datum, pid?

      Grüße
       Andreas

      1. Hi,

        das mit dem group +ber zwei Felder geht wohl schon, aber ich bekomme noch nicht die Where-Clausel hin, mit dem count(*) > 1

        select *,count(*) as test from buchungen where ndatum like '2002-01%' AND test > 1 group by personalnummer, ndatum;

        'test' ist im where-teil noch nicht bekannt.

        Muss ich das also doch in einer Schleife laufen lassen und auf > 1 überprüfen?

        Gruß,

        Knud

        1. Hi Knud

          das mit dem group +ber zwei Felder geht wohl schon, aber ich bekomme noch nicht die Where-Clausel hin, mit dem count(*) > 1

          Es ist eine Grouping-Funktion die du überprüfen willst,
          die ist aber während dem dass die wheres geprüft werden
          gar noch nicht ermittelt. Dafür gibt es:

          having bedingung

          Ich weis allerdings nicht mehr auswändig ob die vor oder
          nach der Group by clause kommt.

          Gruss Daniela

          1. Hi Danelia,

            danke, das wars eigentlich schon.
            das having kommt hinter das group und jetzt werden alle ausgegeben, wo mehr als einmal gebucht wurde. Die Summe wiederrum hole ich mir mit
            mysql_affected_rows und dann hab ich endlich die Zahl, die ich gesucht habe.

            Danke Dir und den anderen natürlich auch!

            Gruß,

            Knud

        2. Hallo,

          das mit dem group +ber zwei Felder geht wohl schon, aber ich bekomme noch nicht die Where-Clausel hin, mit dem count(*) > 1

          select *,count(*) as test from buchungen where ndatum like '2002-01%' AND test > 1 group by personalnummer, ndatum;

          'test' ist im where-teil noch nicht bekannt.

          verwende doch count(*) anstelle von test.
          Außerdem solltest Du vorsichtig sein, wenn ndatum nicht nur das Datum beinhaltet, sonder auch unterschiedliche Uhrzeiten. Sonst gruppiert das statement auch nach der Zeit, was allerdings in Deinem Fall nicht das Gelbe vom Ei wäre. Vielleicht solltest Du mit

          select personalnummer,max(ndatum)
             from buchungen
             group by personalnummer,TO_DAYS(ndatum)
             having count(*) >1

          arbeiten, um die relevanten Informationen rauszuholen.
          BTW.: Wenn Du 'group by' einsetzt, dann mußt Du alle Felder, welche nicht in der 'group by'-Klausel verwendet werden, mittels Aggregatfunktionen abfragen (SUM,COUNT,MIN,MAX,...) siehe http://www.mysql.com/documentation/mysql/bychapter/manual_Reference.html#Group_by_functions

          Muss ich das also doch in einer Schleife laufen lassen und auf > 1 überprüfen?

          nein

          Grüße
            Klaus

  2. Moin!

    Vielleicht nicht die performanteste oder gar eleganteste Lösung, aber ein Versuch ist es Wert:

    erstmal die Max-Personalnummer aufragen,
    dann eine Schleife die von $i=1 bis Max-Personalnummer läuft, in der Schleife:

    SELECT count(*) FROM taballe GROUP BY datum HAVING personalnummer = $i

    und dann mußt Du nur noch gucken wo count(*) größer als 1 ist!

    Aber keien Gewähr, hate ich nur mal so überlegt!

    Bite berichtigen!

    Grüße
      Andreas