Avatar billede mite Nybegynder
12. april 2006 - 10:12 Der 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.
Avatar billede terry Ekspert
12. april 2006 - 12:18 #1
If you dont get help with your problem, then you can send your db to eksperten@NOSPAMsanthell.dk and I will take a look when I get a bit of time.

remove NOSPAM

if you can also give some examples of what you want then this might help
Avatar billede mite Nybegynder
12. april 2006 - 12:52 #2
Hej terry
Jeg sender databasen til dig når jeg kommer hjem fra arbejde kl. 17.00...håber du vil kigge på den her i påsken.
På forhånd tak.
/mite
Avatar billede overchord Nybegynder
12. april 2006 - 13:26 #3
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.
Avatar billede kjulius Novice
13. april 2006 - 00:50 #4
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.
Avatar billede mite Nybegynder
13. april 2006 - 10:04 #5
Hej kjulius
Der kommer en fejl i forespørgslen. Jeg vil gerne sende dig databasen...er du interesseret skriver du bare din mail.
Avatar billede kjulius Novice
14. april 2006 - 01:36 #6
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...
Avatar billede terry Ekspert
16. april 2006 - 17:53 #7
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;
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester