12. april 2006 - 10:12Der er
6 kommentarer og 1 løsning
Forspørgselsproblem med count og gennensnit
Jeg mangler virkelig nogen eksperter til at kigge på mit problem. Jeg er ved at sætte sidste finger på mit managerspil til vores lokale klub og jeg skal lave en forspørgsel som trækker følgende ud fra min database: Vise puljenavne med oplysninger om puljenavn, antal hold i puljen og gennemsnit.
Den SQL jeg har lavet ser således ud: SELECT (Sum(Points.point)-GEBYR.gebyr) AS AntPoint, HOLDPULJE.puljeID, [AntPoint]/(SELECT count(*) FROM HOLDPULJE H WHERE H.puljeID = [HOLDPULJE]![puljeID]) AS PointAverage, PULJE.puljeNavn, GEBYR.gebyr FROM GEBYR INNER JOIN ((HOLDPULJE INNER JOIN ((holdnavne INNER JOIN holdspillere ON holdnavne.autoID = holdspillere.autoID) LEFT JOIN Points ON holdspillere.spillerID = Points.spillerID) ON HOLDPULJE.autoID = holdspillere.autoID) INNER JOIN PULJE ON HOLDPULJE.puljeID = PULJE.puljeID) ON GEBYR.autoID = holdspillere.autoID WHERE (((HOLDPULJE.puljeform)<>"firma") AND ((Points.rundeNr)>=[holdspillere].[holdrundenr] And (Points.rundeNr)<=[holdspillere].[tilrundenr])) GROUP BY HOLDPULJE.puljeID, PULJE.puljeNavn, GEBYR.gebyr ORDER BY HOLDPULJE.puljeID;
Problemet med denne forspørgsel er: - at et hold kan have købt og solgt spillere på et tidspunkt og derfor har betalt gebyr. Dette gebyr skal jo så trækkes fra AntPoint for at give det rigtige resultat. Det har jeg også gjort, men den samler ikke holdene i 1 række, men i flere rækker - antal af hold som beregnes i denne (SELECT count(*) FROM HOLDPULJE H WHERE H.puljeID = [HOLDPULJE]![puljeID]) ikke er korrekt idet den tager alle tilmeldte hold i puljen. Hvis der er et hold som er tilmeldt i spillerunde 3 og der kun er givet point for spillerunde 1 og 2 så skal dette hold jo ikke tælles med i antal af hold som er i puljen.
Jeg vil gerne maile en database for dem som har lyst til at hjælpe.
Håber virkelig der er nogen derude som kan sit databasekram.
Det eneste der slog mig umiddelbart er dine tabel-navne omkring "FROM HOLDPULJE H WHERE H.puljeID = [HOLDPULJE]![puljeID]" - der mangler enten et komma eller endnu en join mellem de to tabeller.
Det er lidt svært umiddelbart at overskue din SQL og Access gør det ikke ligefrem lettere med alle de paranteser (er jeg den eneste, som hader dem?), så jeg har formatteret den lidt anderledes:
SELECT (Sum(Points.point)-GEBYR.gebyr) AS AntPoint, HOLDPULJE.puljeID, [AntPoint]/(SELECT count(*) FROM HOLDPULJE H WHERE H.puljeID = HOLDPULJE.puljeID AND H.autoID IN ( SELECT DISTINCT holdspillere.autoID FROM holdspillere INNER JOIN points ON HOLDPULJE.autoID = holdspillere.autoID WHERE Points.rundeNr BETWEEN holdspillere.holdrundenr AND holdspillere.tilrundenr ) ) AS PointAverage, PULJE.puljeNavn, GEBYR.gebyr FROM holdspillere INNER JOIN GEBYR ON GEBYR.autoID = holdspillere.autoID INNER JOIN holdnavne ON holdnavne.autoID = holdspillere.autoID INNER JOIN HOLDPULJE ON HOLDPULJE.autoID = holdspillere.autoID INNER JOIN Points ON Points.spillerID = holdspillere.spillerID INNER JOIN PULJE ON HOLDPULJE.puljeID = PULJE.puljeID WHERE HOLDPULJE.puljeform <> "firma" AND Points.rundeNr BETWEEN holdspillere.holdrundenr AND holdspillere.tilrundenr GROUP BY HOLDPULJE.puljeID, PULJE.puljeNavn, GEBYR.gebyr ORDER BY HOLDPULJE.puljeID;
Jeg har ændret lidt på den. Forhåbentlig hjælper det lidt, at COUNT(*) selecten har fået tilføjet et ekstra selektionskriterie...
Måske bemærker du også, at alle joins er ændret til INNER JOINs. Jeg kunne ikke se formålet med LEFT JOIN på Points tabellen, da der blev filtreret på et felt fra denne tabel i WHERE sætningen og der ikke blev tilladt at dette felt var NULL. Dermed var virkningen af LEFT instruktionen ophævet.
Jeg har selvfølgelig ikke testet mit forslag, så det er ren "educated guessing", som man siger.
Lidt at tænke over i påsken? Tja, jo, måske... Du kan evt. sende den til kjulexpsnabelayahoopunktumdk (du skal erstatte ordene snabela og punktum :-), så skal jeg gøre et ærligt forsøg...
solution: Maybe not the most elegant one, but it works.
First a query (qryPG) SELECT HOLDPULJE.puljeID AS PID, Count(HOLDPULJE.autoID) AS AID, Sum(GEBYR.gebyr) AS G FROM GEBYR INNER JOIN ((HOLDPULJE INNER JOIN HOLDNAVNE ON HOLDPULJE.autoID = HOLDNAVNE.autoID) INNER JOIN [SELECT DISTINCT RundeNr FROM POINTS]. AS P ON HOLDNAVNE.holdRundeNr = P.RundeNr) ON GEBYR.autoID = HOLDPULJE.autoID GROUP BY HOLDPULJE.puljeID ORDER BY HOLDPULJE.puljeID, Count(HOLDPULJE.autoID);
then SELECT HOLDPULJE.puljeID, PULJE.puljeNavn, qryPG.AID, Sum(Points.point) AS Point, [Point]-[G] AS AntPoint, qryPG.G, ([AntPoint])/[AID] AS PointAverage FROM qryPG INNER JOIN ((HOLDPULJE INNER JOIN (holdspillere LEFT JOIN Points ON holdspillere.spillerID = Points.spillerID) ON (holdspillere.holdID = HOLDPULJE.holdID) AND (HOLDPULJE.autoID = holdspillere.autoID)) INNER JOIN PULJE ON HOLDPULJE.puljeID = PULJE.puljeID) ON qryPG.PID = PULJE.puljeID WHERE (((HOLDPULJE.puljeform)<>"firma") AND ((Points.rundeNr)>=[holdspillere].[holdrundenr] And (Points.rundeNr)<=[holdspillere].[tilrundenr])) GROUP BY HOLDPULJE.puljeID, PULJE.puljeNavn, qryPG.AID, [Point]-[G], qryPG.G ORDER BY HOLDPULJE.puljeID;
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.