(MySQL) wiedermal ein spezielles select-Problem
Knud
- datenbank
0 Michael Schröpl0 andreas0 Knud0 Daniela Koller0 Knud
0 Klaus Mock
0 andreas
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
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
Moin!
oder so:-)
- 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
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
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
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
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
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