Avatar billede 3dmaxer.dk Nybegynder
09. juni 2002 - 19:06 Der er 12 kommentarer og
1 løsning

avg uden de 5 øverste og nederste problemer

Jeg stillede tidligere i dag dette spm, men accepterede lidt for hurtigt for jeg er stødt ind i problemer:

-----spørgsmål---
Jeg har en tabel med en række tal som jeg ønsker at finde gennemsnittet. Der bruger jeg Avg funktionen. Dog ønsker jeg ikke de 5 højste og de 5 laveste tal regnes med i gennemsnittet - hvordan kan det lade sig gøre?
---------

-----svar-----
SELECT AVG(tal) FROM tbl where id NOT IN (SELECT TOP 5 id FROM tbl ORDER BY tal ASC) AND id NOT IN (SELECT TOP 5 id FROM tbl ORDER BY tal DESC)

hvor tal er feltet, der skal findes gennemsnit af, id er din primary key og tbl er navnet på tabellen.
----------

Problemet er, at hvis der er flere af samme tal, så dur det svar ikke.

fx. hvis der er følgende tal i tabellen
25*10 (25 10-taller)
13*9
11*8
1*7
4*6

så regner den gennemsnittet ud til (13*9+11*8)/24 = 8,54 ved ovenstående statement og der er jo forkert.

Den rigtige måde er (20*10+13*9+11*8)/44 = 9,20

Kan det lade sig gøre at udregne det rigtige gennesnit?
Avatar billede terry Ekspert
09. juni 2002 - 20:00 #1
the problem with using TOP is that IF more than record have the same value then ALL record having this value are retrieved. In your example there are 25 with the same value so they are ALL included in the TOP 5.
09. juni 2002 - 20:07 #2
Du er nok nødt til at splitte det op i 2 forespørgsler.

Den første (kaldet tmp):
SELECT TOP 5 ID, Tal
FROM Tbl
ORDER BY Tal
UNION SELECT TOP 5 ID, tal
FROM Tbl
ORDER BY Tal DESC

Den anden:
SELECT Avg(Tal) FROM Tbl
WHERE ID Not In (Select ID From tmp)

/Thomas
09. juni 2002 - 20:08 #3
PS: Access tillader ikke en UNION-forespørgsel i en Sub-query, hvorfor Query 1 (tmp) ikke bare kan puttes ind i parentesen til sidst!
Avatar billede kimiwan Nybegynder
09. juni 2002 - 20:11 #4
terry:

Jeg kan godt se, den ikke gør det, men burde den ikke først tage alle 25 records, hvis man skrev TOP 5 id WITH TIES?  Eller er det en access-specialitet at WITH TIES er default?
Avatar billede terry Ekspert
09. juni 2002 - 20:15 #5
SELECT AVG(tal) FROM tbl where id NOT IN (SELECT TOP 5 id FROM tbl ORDER BY tal ASC, ID DESC) AND id NOT IN (SELECT TOP 5 id FROM tbl ORDER BY tal DESC, ID ASC)
Avatar billede terry Ekspert
09. juni 2002 - 20:19 #6
WITH TIES is used in MS SQL but not in Access (as far as I now)
Avatar billede kimiwan Nybegynder
09. juni 2002 - 20:24 #7
Ah.. det glemte min ellers glimrende sql-bog lige at gøre opmærksom på.  Takker :o)
Avatar billede terry Ekspert
09. juni 2002 - 20:32 #8
your welcome :o)

Thomas have you tried takeing the HIGHEST 5 first and then the lowest?
SELECT TOP 5 ID, Tal
FROM Tbl
ORDER BY Tal DESC
UNION SELECT TOP 5 ID, tal
FROM Tbl
ORDER BY Tal

Isnt the a bit strange? (thats if you get the samee result as me)
Avatar billede terry Ekspert
09. juni 2002 - 20:35 #9
Thomas>You should also try adding 2 more records with 6's :o(
09. juni 2002 - 20:41 #10
Hmm, weird!!!??? Can you explain that?

I can see, that your query is better than mine (didn't think about the AND operator)
Avatar billede terry Ekspert
09. juni 2002 - 20:55 #11
No I cant explain it!  and as long as there a MAX 5 records return in the frist select then it works even if there are more than 5 in the last select.
But it goes wrong as soon as there are more than 5 in the first.
Avatar billede 3dmaxer.dk Nybegynder
09. juni 2002 - 20:55 #12
Terry, you are the man. Seems to work :)
Avatar billede terry Ekspert
09. juni 2002 - 21:17 #13
thanks>Just hope it continues to work :o)
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