Forum Doku Wiki Blog

Forumsarchiv 2002, März
(MySQL) wiedermal ein spezielles select-Problem

archivierte Beiträge lesen

  1. (DATENBANK) (MySQL) wiedermal ein spezielles select-Problem von Knud, 04. 03. 2002, 09:56

(MySQL) wiedermal ein spezielles select-Problem

Der folgende Beitrag wurde am 04. 03. 2002, 09:56 Uhr von Knud veröffentlicht.

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

(MySQL) wiedermal ein spezielles select-Problem

Der folgende Beitrag wurde am 04. 03. 2002, 10:15 Uhr von Michael Schröpl veröffentlicht.

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

(MySQL) wiedermal ein spezielles select-Problem

Der folgende Beitrag wurde am 04. 03. 2002, 10:23 Uhr von andreas veröffentlicht.

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

(MySQL) wiedermal ein spezielles select-Problem

Der folgende Beitrag wurde am 04. 03. 2002, 10:44 Uhr von Knud veröffentlicht.

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

(MySQL) wiedermal ein spezielles select-Problem

Der folgende Beitrag wurde am 04. 03. 2002, 10:54 Uhr von Daniela Koller veröffentlicht.

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

(MySQL) wiedermal ein spezielles select-Problem

Der folgende Beitrag wurde am 04. 03. 2002, 11:06 Uhr von Knud veröffentlicht.

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

(MySQL) wiedermal ein spezielles select-Problem

Der folgende Beitrag wurde am 04. 03. 2002, 11:01 Uhr von Klaus Mock veröffentlicht.

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

(MySQL) wiedermal ein spezielles select-Problem

Der folgende Beitrag wurde am 04. 03. 2002, 10:21 Uhr von andreas veröffentlicht.

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

© 1998-2013 SELFHTMLImpressumSoftware: Classic Forum 3.4