Zählen gleicher Inhalte in einem Datensatz

McKoy

Grünschnabel
Hallo,

ich möchte gerne eine Datenbank für unsere kleine Billardgemeinschaft stricken. Ich habe ein Haupttabelle gestaltet, Wo jeder Datensatz die Ergebnisse eines Spieltages (12 Spiele ) festhält. Aufgeteilt ist diese in (LfdNr. | Datum| Sieger 1| Sieger 2|Sieger 3|.....) Die Spielreihenfolge ist festgelegt und per Textfeldern im Formular sichtbar. Der Sieger eines Spiels wird mittels Dropdown festgelegt. Das funktioniert soweit prima.
Nun aber zu meiner Frage, die ich trotz intensiver Suche nicht gefunden oder eventuelle Antworten nicht verstanden habe, da es hier um VBA Skripte ging.
Ich möchte gerne zählen, wie oft ein Spieler den Abend gewonnen hat. Also wie oft ein Name in einem Datensatz vorkommt.

Weitere Informationen per Screenshot etc. sende ich gerne zu. In Excel würde ich dies über die Funktion "ZÄHLENWENN" realisieren.

Bin für jede dankbar!

Gruß
McKoy
 
Natürlich währe eine Normalsierung das einzig ware

Es geht natürlich schon auch anders. Hier mal ein Lösungsansatz über die UNION (geht nur da du genau weisst wieviele Sieger es sind

SQL:
SELECT 
	sieger
	COUNT(LfdNr)
FROM	
	(	SELECT LfdNr,  Datum, sieger1 AS sieger FROM spieltag
		UNION SELECT LfdNr,  Datum, sieger2 AS sieger FROM spieltag
		UNION SELECT LfdNr,  Datum, sieger3 AS sieger FROM spieltag$
		......
		UNION SELECT LfdNr,  Datum, sieger12 AS sieger FROM spieltag
	) AS s
WHERE
	s.Datum = myDate
GROUP BY sieger

Ein ZÄHLENWENN würde im Konzept etwa so aussehen
SQL:
SELECT
	groupfield,
	SUM(IF([BedinungIsTrue], 1, 0))
FROM
	table
GROUP BY
	groupfield
 
Zuletzt bearbeitet von einem Moderator:
Wenn dein Datensatzformat so bleiben soll, könntest du folgenden Trick verwenden:

Lies alle Spalten gemeinsam in einen string
PHP:
SELECT concat(SIEGER1 , SIEGER2 , ... ) as AlleSieger From ...
Ermittle die Länge von AlleSieger mit length -> SatzLaengeVorher
Ermittle die Länge des Spielernamens -> SpLaenge
Ersetze in AlleSieger den Namen des Spielers an jeder Stellte durch die Zeichenkette '*'.
Ermittle nun die neue Länge der Zeichenkette AlleSieger ->SatzLaengeNachher
Dividiere die Differenz von SatzLaengeNachher und SatzLaengeVorher durch (SpLaenge-1)
Also
Anzahl = (SatzLaengeNachher - SatzLaengeVorher) / (SpLaenge-1)
Damit erhältst du die Anzahl der Siege des Spielers
 
Ok, dass sollte auch in einem Select-Befehl funktionieren :
PHP:
select
  (
    charLength(replace(concat(Sieger1, ..., Sieger12),'SpielerName','x')) -
    charLength(Concat(Sieger1, ..., Sieger12))
  ) / (charLength('SpielerName')-1) as Anzahl
from
  ....
 
Ok Problem
Wenn ein Spieler Ben und der andere Benjamin heißt
also mußt du im Concat die Namen noch in Begrenzer setzen, etwa so:
PHP:
select
  (
    charLength(replace(concat('#',Sieger1,'#', Sieger2,'#', ...,'#', Sieger12,'#'),'#SpielerName#','x') -
    charLength(Concat('#',Sieger1,'#', Sieger2, '#',..., '#',Sieger12,'#')
  ) / (charLength('#SpielerName#')-1) as Anzahl
from
  ....
 
Jetzt kommt der Zeitpunkt wo man wissen muss welche DB.....
Ich ging von MySQL aus:
item: es gibt da kein charLength(). Wahrscheinlich ist das analog zu BIT_LENGTH()
item: wenn, dann bitte mit CONCAT_WS("#", spieler1, spieler2..)
item: Ich denke das das dauernde Zusammenfügen und ersetzen von Strings nicht gerade performant ist.
item: Das UNION-Query kann auch als View gespeichert werden, wenn man den WHERE-Block entfernt
 
Sooo... :confused:

ich habe alle Eure Antworten gelesen, nur leider fast nichts verstanden. Ich probiere mal, das Verstandene umzusetzen.

Ich wollte dieses "Projekt" mit Access 2007 realisieren. Da sich das Ding aber noch im Aufbau befindet, ist es absolut kein Beinbruch, wenn ich das alles noch einmal neu mache.

IST Situation: Wir spielen mit einer festen Gemeinschaft von 4 Personen einen Tag in der Woche Billard. Bei einer Hin- und einer Rückrunde sind 12 Spiele pro Abend fällig, damit jeder gegen jeden 2x gespielt hat.

SOLL Situation: Ich möchte gerne eine "Eingabemaske" haben, wo alle Spiele des Abends sichtbar und einzutragen sind. Direkt unter oder auch in dieser Maske hätte ich gerne eine kleine Patzierungsliste, welche sich nach jeder Eingabe aktualisiert. Folgende Punkte sollen in dieser Maske angezeigt werden:

  • Datum des Spieltages (fest vorgegeben)
  • Sieger 1. Spiel
  • Sieger 2. Spiel
  • Sieger....
  • Foul 1. Spiel
  • Foul 2. Spiel
  • Foul...

Bei "Foul" würde mir eine Box zum Abhaken reichen. Diese soll zeigen, dass ein Spieler ein Spiel durch ein Foul verloren hat (8 falsch versenkt, Kugel vom Tisch, etc). Dieses Foul soll dem Spieler zugeordnet werden und sollte auch zählbar sein.

Habt Ihr dazu Vorschläge, wie ich das am Besten in Access umsetze? Ich habe als Newbie bis jetzt eine "große" Tabelle mit allen Infos angelegt und die Eingabemaske (ohne Statistik) angefertigt. Das Eingaben der Datensätze funktioniert soweit.

Frage: Sollte ich die Tabellen noch weiter aufteilen, um evtl. Abfragen wie z.B. das Zählen der Siege zu vereinfachen?

Gruß
McKoy
 
Jetzt kommt der Zeitpunkt wo man wissen muss welche DB.....
Ich ging von MySQL aus:
item: es gibt da kein charLength(). Wahrscheinlich ist das analog zu BIT_LENGTH()
item: wenn, dann bitte mit CONCAT_WS("#", spieler1, spieler2..)
item: Ich denke das das dauernde Zusammenfügen und ersetzen von Strings nicht gerade performant ist.
item: Das UNION-Query kann auch als View gespeichert werden, wenn man den WHERE-Block entfernt

Hi yaslaw
Der Tipp mit der Datenbank war gar nicht schlecht (siehe Post vorher), aber
* die verwendeten Befehle sind MySQL 5.1 - Syntax
* das Zusammenfügen geschieht nur 2 x
* replace nur 1x
so gravierend werden diese Befehle die Performance nicht runterreoßen können.

ABER
Da es eh in Access laufen soll, ist es sowieso für die Katz....
also nix für ungut
 
Zurück