kruistabel query probleem top 5 waarden

Status
Niet open voor verdere reacties.

JohanRVT

Gebruiker
Lid geworden
2 mrt 2011
Berichten
555
Beste,

geraak er niet netjes uit om uit de tabel in bijgevoegde db een overzichtelijke query, tabel, rapport.... te krijgen waarbij dat per Club bij de Heren (aangeduid met een M in kolom geslacht) de 5 beste plaatsen (lees laagste) waarden uit de kolom plaats genomen voor het berekenen van een eindtotaal waarbij dat er dan gerangschikt wordt van laagste waarde naar hoogste waarde.Winnende club is dus de club met het laagste eindtotaal. Bij de dames gebeurt iets gelijkaardigs maar met enkel de 3 beste waarden. Alle opgenomen records moeten te zien zijn zodat er visueel kan gecontroleerd worden.
Clubs die niet aan het vereiste aantal van 5 of 3 voldoen moeten ook in de "uitslag" voorkomen maar dan na de laatste van de club's die wel aan de voorwaarden hebben voldaan.
De uitslagen van de dames en heren mogen gerust in aparte tabellen of query's
Hoop dat het een beetje duidelijk is.
 

Bijlagen

Is mij niet helemaal duidelijk. Je zegt 'Winnende club is dus de club met het laagste eindtotaal' maar er staan geen eindtotalen in de tabel.
 
Kijk eens naar het veld [Plaats]. Daar staat de winnende club bij de mannen (ITC) en bij de vrouwen is dat SOLID. Tenzij ik het natuurlijk ook verkeerd begrijp...
 
Zou er ongeveer zo moeten uitzien als voorbeeldje van vroeger in Excel (hier wel met 4 atleten)
Knipsel.PNG
 
OK, het wordt iets duidelijker nu :)
Maar waarom staan de atleten, clubs en eindtotalen niet in je database? Of mogen wij dat lekker zelf doen? :p

En als ik het goed begrijp zijn deze eindtotalen eigenlijk strafpunten? Omdat je zegt dat de club met het laagste eindtotaal de winnende club is.
 
En waar is de rangorde in het veld 'plaats' in de tabel 'uitslag' eigenlijk op gebaseerd?
 
En als ik het goed begrijp zijn deze eindtotalen eigenlijk strafpunten? Omdat je zegt dat de club met het laagste eindtotaal de winnende club is.
Kijk eens naar een willekeurige competitie; degene die op 1 staat wint doorgaans :).
 
Winnende club is dus de club met het laagste eindtotaal.
Dat lijkt mij uiterst oneerlijk; een club met één deelnemer die op 14 eindigt wint dan het clubklassement van de club met 5 deelnemers die resp. 1,2,3,4 en 6 wordt: het opteltotaal van Club 1 is namelijk 14, en het clubtotaal van het tweede voorbeeld 16. Wint club 1 dan? Ik denk dat de enige eerlijke manier van clubwinnaar berekenen is om het gemiddelde per club te nemen. Club 1 heeft dan een gemiddelde van 14 (14/1) en club 2 een gemiddelde van 3,2 (16/5). Lijkt mij duidelijk wie dat wint :)
 
Tijd voor een oplossing :).
Hier een query die de 5 beste mannen en 3 beste vrouwen per club selecteert. Query gebruikt een subquery die je makkelijk kunt aanpassen om andere selecties te maken.
Code:
SELECT Uitslag.Id, Uitslag.Start_Nr, Uitslag.Club, Uitslag.Plaats, Uitslag.Geslacht
FROM Uitslag
WHERE (((Uitslag.Id) In (SELECT TOP 5 [ID] 
   FROM Uitslag AS Dupe 
   WHERE Dupe.Club = Uitslag.Club AND Dupe.Geslacht = 1 
   ORDER BY Dupe.Plaats )))
ORDER BY Uitslag.Club, Uitslag.Geslacht
UNION SELECT Uitslag.Id, Uitslag.Start_Nr, Uitslag.Club, Uitslag.Plaats, Uitslag.Geslacht
FROM Uitslag
WHERE (((Uitslag.Id) In (SELECT TOP 3 [ID] 
   FROM Uitslag AS Dupe 
   WHERE Dupe.Club = Uitslag.Club AND Dupe.Geslacht = 2 
   ORDER BY Dupe.Plaats )))
ORDER BY Uitslag.Club, Uitslag.Geslacht;
Zoals ik al in een eerder bericht schreef, zou ik eerst eens nadenken over hoe je de winnende club wilt uitrekenen.
 
@ PFL, tabellen voor atleet, club, etc... heb je hier niet nodig, alles dat we nodig hebben zit al geëxporteerd naar deze uitslagtabel. En het eindtotaal moet nogal wiedes worden berekend uit de plaatsen van de club en de rangschikking moet dan gebeuren op het eindtotaal van klein naar groot dus.

@ Octafish, bedankt alvast maar daar mee hebben we nog geen mooie kruistabel of zo waar je de club's ziet (met de respectievelijke plaatsen in kolommen), gerangschikt volgens de teams met de laagste optelsom van de plaatsen (strafpunten), waarbij er dus moet voor gezorgd worden dat de club's die bij de manen effectief met 5 zijn aangekomen van voren staan (club's die dus maar 4 of minder aankomsten hebben staan altijd na die club's)
Ik heb jouw query even aangepast naar "M" en "F" en opgedeeld in 2 aparte query's in bijgevoegde db2
 

Bijlagen

@ Octafish, bedankt alvast maar daar mee hebben we nog geen mooie kruistabel of zo
..
Ik heb jouw query even aangepast naar "M" en "F" en opgedeeld in 2 aparte query's in bijgevoegde db2
ad 1: de query is prima te gebruiken als basis voor een kruistabel; het was niet mijn insteek om gelijk alle problemen op te lossen, maar eerst te laten zien hoe je de dataset netjes filtert.
ad 2: Ik had jouw Geslacht juist vervangen door een keuzelijst met 2 kolommen om numeriek te kunnen sorteren :). Bovendien filtert het makkelijker op getallen dan op tekst. Maar het is jouw db :).
 
Lijkt mij logisch als je zelf de keuzelijst niet hebt aanpast :).
 
Excel heeft een functie die "transponeren" wordt genoemd (rijen omzetten naar kolommen en omgekeerd via "plakken speciaal"), zoiets zouden er in feite moeten kunnen nagebootst worden
Heb dus een kruistabel query gemaakt die zoiets doet maar op die manier krijg je evenveel kolommen als er plaatsen zijn en dat is niet echt de bedoeling; er mogen maar 5 kolommen zijn.
 

Bijlagen

Laatst bewerkt:
Een kruistabel werkt op een logische kolom, en jouw veld Plaats is dat niet; elke plaats komt namelijk maar één keer voor. Vandaar dat je alle plaatsen ziet. Je zult dus een extra veld moeten toevoegen dat per club en geslacht het plaatsnummer bepaalt. Dat kun je zo doen:
PHP:
SELECT Huidige_Uitslag.Start_Nr, Huidige_Uitslag.Club, Huidige_Uitslag.Plaats, Huidige_Uitslag.Geslacht, DCount("[ID]","[Huidige_Uitslag]","[ID]<=" & [ID] & " AND [Club] ='" & [Club] 
& "' AND [Geslacht] ='M'") AS Plaatsnr
FROM Huidige_Uitslag
WHERE (((Huidige_Uitslag.Start_Nr) In (SELECT TOP 4 [Start_Nr]  FROM Huidige_Uitslag AS Dupe  WHERE Dupe.Club = Huidige_Uitslag.Club AND Dupe.Geslacht = "M" ORDER BY Dupe.Plaats )))
ORDER BY Huidige_Uitslag.Club, Huidige_Uitslag.Plaats
UNION
SELECT Huidige_Uitslag.Start_Nr, Huidige_Uitslag.Club, Huidige_Uitslag.Plaats, Huidige_Uitslag.Geslacht, DCount("[ID]","[Huidige_Uitslag]","[ID]<=" & [ID] & " AND [Club] ='" & [Club] 
& "' AND [Geslacht] ='F'") AS Plaatsnr
FROM Huidige_Uitslag
WHERE (((Huidige_Uitslag.Start_Nr) In (SELECT TOP 3 [Start_Nr]  FROM Huidige_Uitslag AS Dupe  WHERE Dupe.Club = Huidige_Uitslag.Club AND Dupe.Geslacht = "F" ORDER BY Dupe.Plaats )))
ORDER BY Huidige_Uitslag.Club, Huidige_Uitslag.Plaats;
 
Bedankt Octafish,
ik heb jouw union query gesplitst in man en vrouw en een module gemaakt waarmee ik dan de unieke club's toevoeg aan 2 nieuwe tabellen en via updatequeries, dan vul ik de plaatsen in en laadt dan het boeltje via 2 subrapporten in één rapport.
Misschien niet de fraaiste manier maar het werkt en voordeel van een tabel is dat je er nog andere dingen mee kunt doen zoals dubbele punten berekenen voor één bepaalde wedstrijd en DSQ (Disqualified) toepassen.
 

Bijlagen

Ik ben er zelf ook achter gekomen dat een UNION niet werkt als basis voor een kruistabel; door met een Tabelmaakquery te werken heb je vaste data, en dan is de rest een peuleschil!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan