Avatar billede steen_hansen Forsker
26. september 2007 - 15:20 Der er 62 kommentarer og
1 løsning

Beregn gennemsnit

Hvordan finder jeg gennemsnittet, hvor (i dette tilfælde) ID2 = 43?

<%
Dim RS, SQL, averageRS
Set RS = Conn.Execute("SELECT * FROM MinTabel WHERE ID2 = 43 ORDER BY vTitle ASC")
SQL = "SELECT AVG(points) AS AveragePoints FROM MinTabel WHERE .......?"
Set averageRS = Conn.Execute(SQL)

If Not RS.EOF Then

    Do Until RS.EOF
%>
    <a href="/../../dokument.asp?ID1=<%=RS("ID1")%>&ID2=<%=RS("ID2")%>" title="<%=RS("description")%>"><%=RS("vTitle")%></a>
    <%=averageRS("AveragePoints")%>
<%
    RS.MoveNext
    Loop
Else
%>

    <form>
        .......
    </form>

<% End If %>
Avatar billede plx Nybegynder
26. september 2007 - 15:37 #1
du kan benytte AVG(AveragePoints) i din sql, eller gøre det i din kode, hvis du alligevel løber posterne igennem

total = 0
cnt = 0

Do Until RS.EOF
  total  = total + averageRS("AveragePoints")
  cnt = cnt + 1
  ...
Loop

If cnt > 0 Then
  gennemsnit = total/cnt
End If
Avatar billede plx Nybegynder
26. september 2007 - 15:42 #2
jeg tror ikke, jeg fik læst dit spørgsmål ordentligt.
Avatar billede steen_hansen Forsker
26. september 2007 - 15:53 #3
Håber du kan komme op med noget alligevel :)
Avatar billede snakeeye Nybegynder
26. september 2007 - 16:35 #4
Jeg er ikke 100% sikker på hvad du er ude efter, men kan du ikke bare bare lave din SQL sætning som:
SELECT AVG(points) AS AveragePoints FROM MinTabel WHERE ID2 = 43

???

eventuelt smide den samme men din første SQL sætning
Avatar billede steen_hansen Forsker
26. september 2007 - 17:24 #5
Jo, men ID2 er jo flere variabler (tal)
Avatar billede steen_hansen Forsker
26. september 2007 - 17:27 #6
Jeg angav kun 43 som et eksempel. Det starter jo med 1 og fortsætter til den sidst angivne ID2.
Avatar billede snakeeye Nybegynder
26. september 2007 - 17:39 #7
er det gennemsnittet for alle point som står i collonnen points eller er det kun gennemsnit for det ene ID ?
Avatar billede steen_hansen Forsker
26. september 2007 - 18:23 #8
Det er kun gennemsnit pr. ID. Det burde være så simpelt - og er det sikkert også, når løsningen foreligger :)
Avatar billede snakeeye Nybegynder
26. september 2007 - 19:11 #9
som det eksempel som du har givet i toppen kan du godt bruge den sætning som jeg skrev...
rent faktisk kan du bruge denne:
SELECT *, AVG(points) AS AveragePoints FROM MinTabel WHERE ID2 = 43
hvor du så for trukket alt data ud fra MinTabel hvor ID2 = 43 samt den regner gennemsnittet ud for ID2 = 43...
Avatar billede steen_hansen Forsker
26. september 2007 - 21:47 #10
Det er jeg klar over, men det skal jo rendes igennem en løkke, og skal kunne beregnes på de ID's, hvor ID2 = 1, ID2 = 2, ID2 = 3 etc. Var det bare den ene, var det ikke noget problem.

Min første indskydelse var en relationsdatabase, men det burde kunne lade sig gøre på denne måde .... vil jeg mene :)
Avatar billede snakeeye Nybegynder
26. september 2007 - 21:59 #11
ja okay, jeg tror jeg er ved at have en ide om hvad du vil.

hvad med noget i stil med dette:

SELECT *, AVG(points) AS AveragePoints FROM MinTabel GROUP BY points

noget i den stil...
ref: http://www.w3schools.com/sql/sql_groupby.asp
Avatar billede snakeeye Nybegynder
26. september 2007 - 22:00 #12
ehmm...... GROUP ID2  i stedet
altså

SELECT *, AVG(points) AS AveragePoints FROM MinTabel GROUP BY ID2
Avatar billede steen_hansen Forsker
26. september 2007 - 22:19 #13
Jeg tror det snerper, men nu er det kun værdien fra ID2 = 1, der bliver taget .....?
Avatar billede steen_hansen Forsker
26. september 2007 - 22:53 #14
Så vidt jeg kan se, er GROUP BY dét, der skal til. Men det er den første værdi, der bliver trukket ud.
Avatar billede steen_hansen Forsker
26. september 2007 - 23:34 #15
HJÆLP :o[ Det ser ud til, at der kun bliver taget fra ID2, hvor værdien er 1 (den allerførste). Gennemsnittet er rigtigt nok, men det passer jo ikke på de resterende ID's. Håber meget på nogle gode forslag.
Avatar billede steen_hansen Forsker
26. september 2007 - 23:54 #16
Bare lige for en ordens skyld, så ser siden således ud:


<% Set RS = Conn.Execute("SELECT * FROM MinTabel WHERE ID1 = 1 ORDER BY vHeadline ASC") %>

<html>

<body>

<%
If Not RS.EOF Then

    Do Until RS.EOF
        strSQL = "SELECT points, AVG(points) AS AveragePoints FROM MinTabel GROUP BY ID2"
        Set pRS = Conn.Execute( strSQL )
%>

        <%=FormatNumber(pRS("AveragePoints"),2)%>

<%
    RS.MoveNext
    Loop

    RS.Close

End If
%>

</body>

</html>
Avatar billede cpufan Juniormester
27. september 2007 - 00:06 #17
hvis det bare er det totale gennemsnit:

SELECT *, AVG(points) AS AveragePoints FROM MinTabel
Avatar billede cpufan Juniormester
27. september 2007 - 00:06 #18
eller rettere

SELECT AVG(points) AS AveragePoints FROM MinTabel
Avatar billede steen_hansen Forsker
27. september 2007 - 00:11 #19
Det er ikke bare det totale gennemsnit, det er gennemsnittet i alt for hver ID2:

Bruger 1 angiver værdien 4 på ID2, som er lig 43 (f.eks.)
Bruger 2 angiver værdien 7 på ID2
Bruger 3 angiver værdien 5 på ID2

userID=1    ID2=43    points=4
userID=2    ID2=43    points=7
userID=3    ID2=43    points=5

Gennemsnittet for ID2 vil så være 5,33
Avatar billede steen_hansen Forsker
27. september 2007 - 00:13 #20
[Gennemsnittet for ID2 vil så være 5,33]

=

Gennemsnittet for ID2, hvor værdien er 43, vil så være 5,33
Avatar billede snakeeye Nybegynder
27. september 2007 - 00:41 #21
hmm... din side er godt nok lidt skummel, du laver et sql statement som du kører igennem et loop, men du bruger det ikke.
I det loop laver du så nye sql statements som rent faktisk returnerer det samme fordi du netop med dette statement ikke kører dem igennem (vil du kunne se hvis du skriver points ud fra dette statement)
Avatar billede steen_hansen Forsker
27. september 2007 - 00:47 #22
Alt det andet, som skal trækkes gennem loopet, virker fint nok. Men hvor svært kan det være? Der skal bare hives et gennemsnit af pointene ud for hvert ID2. Jeg troede jeg lige kunne klare det med den ene hånd på ryggen, men jeg blev en del klogere :) Men jeg synes heller ikke loopet fungerer mht. pRS. Den udfører SQL'en første gang, og kommer så ikke med igen. Men hvorfor ikke?
Avatar billede steen_hansen Forsker
27. september 2007 - 00:49 #23
PS: Der er masser af HTML, så du skal ikke tro, at det ser ud som i 26/09-2007 23:54:26. Det er kun for at give et overordnet billede :)
Avatar billede plx Nybegynder
27. september 2007 - 01:09 #24
strSQL = "SELECT ID2, AVG(points) AS AveragePoints FROM MinTabel GROUP BY ID2"
Set pRS = Conn.Execute( strSQL )

Do While Not pRS.EOF
    Response.Write pRS("ID2") & ": " & pRS("AveragePoints") & "<br>"
    pRS.MoveNext
Loop
Avatar billede steen_hansen Forsker
27. september 2007 - 01:29 #25
Der er noget af det, plx. Tror jeg da. Men jeg får en masse ud:

7,5010,007,003,008,5010,0010,009,008,001,008,00


KODEN:

<% Do While Not pRS.EOF %>
<%=FormatNumber(pRS("AveragePoints"),2)%>
<%
pRS.MoveNext
Loop
%>
Avatar billede plx Nybegynder
27. september 2007 - 01:33 #26
Du får vel gennemsnittet for hvert id2, som vist var det du ville?
Avatar billede steen_hansen Forsker
27. september 2007 - 01:38 #27
Jeg har blandt andet

Titel - OK
Dato for oprettelse - OK
Gennemsnit - Ikke OK

Gennemsnit ser således ud:

7,5010,007,003,008,5010,0010,009,008,001,008,00

- og det skulle 5,33, hvis du kigger på 27/09-2007 00:11:30
Avatar billede plx Nybegynder
27. september 2007 - 01:43 #28
Det virker fint hos mig, med følgende tabel:

mysql> select * from mintabel;
+----+--------+------+--------+
| id | userid | id2  | points |
+----+--------+------+--------+
|  1 |      1 |  43 |      4 |
|  2 |      2 |  43 |      7 |
|  3 |      3 |  43 |      5 |
|  4 |      1 |    5 |      5 |
|  5 |      2 |    5 |      8 |
|  6 |      7 |    5 |      1 |
|  7 |      4 |    8 |      6 |
+----+--------+------+--------+
7 rows in set (0.00 sec)

mysql> SELECT ID2, AVG(points) AS AveragePoints FROM MinTabel GROUP BY ID2;
+------+---------------+
| ID2  | AveragePoints |
+------+---------------+
|    5 |        4.6667 |
|    8 |        6.0000 |
|  43 |        5.3333 |
+------+---------------+
3 rows in set (0.00 sec)
Avatar billede steen_hansen Forsker
27. september 2007 - 01:44 #29
Du får et gennemsnit på 5,33, og ikke 7,5010,007,003,008,5010,0010,009,008,001,008,00?
Avatar billede steen_hansen Forsker
27. september 2007 - 01:46 #30
<td>
<% Do While Not pRS.EOF %>
<%=FormatNumber(pRS("AveragePoints"),2)%>
<%
pRS.MoveNext
Loop
%>
</td>
Avatar billede plx Nybegynder
27. september 2007 - 01:46 #31
jeg får 4.66676.00005.3333, hvis jeg ikke adskiller dem med noget, et linieskift f.eks.
Avatar billede steen_hansen Forsker
27. september 2007 - 01:51 #32
Ok, jeg har sat et <br> ind:

<td>
<% Do While Not pRS.EOF %>
<%=FormatNumber(pRS("AveragePoints"),2)%><br>
<%
pRS.MoveNext
Loop
%>
</td>

- og får alle point fra alle ID2 udskrevet for hver fil :/
Avatar billede steen_hansen Forsker
27. september 2007 - 01:53 #33
- plus et gennemsnit, kan jeg se
Avatar billede steen_hansen Forsker
27. september 2007 - 01:57 #34
Iflg. din forklaring fra 27/09-2007 01:43:05, burde min side se således ud

FilNavn1    4.67
Filnavn2    6.00
Filnavn3    5.33

Men nu ser den sådan ud:

        4.67
Filnavn1    6.00
        5.33
Avatar billede steen_hansen Forsker
27. september 2007 - 01:58 #35
Prøver lige igen:

            4.67
Filnavn1    6.00
            5.33
Avatar billede steen_hansen Forsker
27. september 2007 - 01:59 #36
Det samme gør sig gældende med Filnavn2, Filnavn3 etc.
Avatar billede steen_hansen Forsker
27. september 2007 - 02:01 #37
Jeg vil smutte, det er langt over min sengetid :) Håber en af Jer kan finde frem til noget :)
Avatar billede snakeeye Nybegynder
27. september 2007 - 15:01 #38
Hej igen...
Jeg har prøvet at køre -> SELECT ID2, AVG(points) AS AveragePoints FROM MinTabel GROUP BY ID2; <- den sql sætning igennem med samme opsætning som "27/09-2007 01:43:05"...
det resultat som jeg får er det samme.. altså
| ID2  | AveragePoints |
+------+---------------+
|    5 |        4.6667 |
|    8 |        6.0000 |
|  43 |        5.3333 |
------------------------

så umiddelbart burde dit også være rigtigt
Avatar billede steen_hansen Forsker
27. september 2007 - 18:41 #39
Ok, jeg glemte forøvrigt at sige, at alt dette ligger i en tabel, så det kommer til at se sådan her ud:

<% Set RS = Conn.Execute("SELECT * FROM MinTabel WHERE ID1 = 1 ORDER BY vHeadline ASC") %>

<html>

<head>
<title></title>
</head>

<body>

<table class="......">
    <% Do While Not pRS.EOF %>

    <tr>
        <td class="......"><%=RS("......")%></td>
        <td class="......"><%=RS("......")%></td>
        <td class="......"><%=RS("......")%></td>
        <td class="......"><%=FormatNumber(pRS("AveragePoints"),2)%></td>
    </tr>

    <%
    pRS.MoveNext
    Loop
    %>

</table>

</body>

</html>

Så kan jeg bedre forstå, at snakeeye synes siden ser skummel ud. Prøver lige dette ...
Avatar billede steen_hansen Forsker
27. september 2007 - 19:04 #40
Nu ser det godt nok skævt ud:

<%
Do Until RS.EOF

    Dim strSQL, pRS
    strSQL = "SELECT points, AVG(points) AS AveragePoints FROM MinTabel GROUP BY ID2"
    Set pRS = Conn.Execute( strSQL )

    Do While Not pRS.EOF

%>

<tr class="......" onclick="location.href='/....../....../document.asp?ID1=<%=RS("ID1")%>&ID2=<%=RS("ID2")%>';" onmouseover="this.style.backgroundColor='#e7e7e7';" onmouseout="this.style.backgroundColor='#fff';">
    <td class="......"><%=RS("......")%></td>
    <td class="......"><%=RS("......")%>......</td>
    <td class="......"><%=RS("......")%>......</td>
    <td class="......"><%=RS("......")%><b>......</b></td>
    <td class="......"><%=FormatNumber(pRS("AveragePoints"),2)%></td>
</tr>

<%
    pRS.MoveNext
    Loop

RS.MoveNext
Loop
%>



Så bliver det samme link trukket ud 8 gange med de rigtige værdier, samt nogle værdier, som er helt skæve. Der trækkes også værdier ud fra andre ID2'ere:

7,50
10,00
7,00
3,00
8,50
10,00
10,00
9,00
8,00
1,00
8,00


De værdier, som er angivet, hvor ID2 = 1, er 10 og 5. Det giver i alt 15, og et gennemsnit på 7,50. Det er jo rigtigt nok. Men nogle af de andre værdier bliver også trukket ud.



Hvis jeg rem'er lidt ud:

<%
Do Until RS.EOF

    Dim strSQL, pRS
    strSQL = "SELECT points, AVG(points) AS AveragePoints FROM MinTabel GROUP BY ID2"
    Set pRS = Conn.Execute( strSQL )

    'Do While Not pRS.EOF

%>

<tr class="......" onclick="location.href='/....../....../document.asp?ID1=<%=RS("ID1")%>&ID2=<%=RS("ID2")%>';" onmouseover="this.style.backgroundColor='#e7e7e7';" onmouseout="this.style.backgroundColor='#fff';">
    <td class="......"><%=RS("......")%></td>
    <td class="......"><%=RS("......")%>......</td>
    <td class="......"><%=RS("......")%>......</td>
    <td class="......"><%=RS("......")%><b>......</b></td>
    <td class="......"><%=FormatNumber(pRS("AveragePoints"),2)%></td>
</tr>

<%
    'pRS.MoveNext
    'Loop

RS.MoveNext
Loop
%>

- kommer gennemsnittet rigtigt ud, nemlig 7,50. Nu er problemet så bare det samme: 7,50 kommer også til at stå ved de 3 andre filer, hvor ID1 = 1. Hvilket betyder, at jeg er tilbage ved udgangspunktet.

Det er sikkert et simpelt spørgsmål om at få placeret sætningerne korrekt. Men jeg synes det er ved at blive lidt kringlet. Håber I kan se lyset. Jeg har lidt svært ved at se det lige nu :/
Avatar billede steen_hansen Forsker
27. september 2007 - 19:29 #41
Skal der lægges en værdi til pRS, laves en Count(x), så scriptet på forhånd ved hvor mange gange løkken skal kører igennem el.lign?

Do While Not pRS.EOF

For i = to ....
i = 1

Do While Not pRS(i).EOF

i = i + 1
Next

Loop

Håber på noget Response.Write fra en af Jer :)
Avatar billede steen_hansen Forsker
27. september 2007 - 19:59 #42
Det sidste er noget sludder, glem det :)
Avatar billede snakeeye Nybegynder
27. september 2007 - 20:53 #43
hvad mener du med
Men nogle af de andre værdier bliver også trukket ud.
i 27/09-2007 19:04:26 ?=
Avatar billede steen_hansen Forsker
27. september 2007 - 21:08 #44
ID2 = 1 fik tilført 10 og 5, hvilket giver et gennemsnit på 7,50 - hvilket er rigtigt nok. Men der blev også hevet værdier fra ID2, hvor ID2 = 2, 3 osv. Se hvilke værdier i 27/09-2007 19:04:26
Avatar billede snakeeye Nybegynder
27. september 2007 - 21:11 #45
altså du vil kun første gang have trukket ud hvor id2 = 1... og så næste gang den kører forbi vil du have trukket ud hvor id2 = 2 ?
Avatar billede steen_hansen Forsker
27. september 2007 - 21:13 #46
Det var idéen :) Det er jo en liste, hvor links til alle filerne bliver trukket ud, og hvor der i tabellen også angives hvilke værdier hver især har fået i gennemsnit.
Avatar billede snakeeye Nybegynder
27. september 2007 - 21:15 #47
hmmm.....
prøv denne så:
strSQL = "SELECT points, AVG(points) AS AveragePoints FROM MinTabel where ID2 = " & RS("ID2")

noget i den stil... er ikke lige så skarp i asp lige nu
Avatar billede steen_hansen Forsker
27. september 2007 - 21:16 #48
Ah, sorry. Jeg havde beskrevet det i et spørgsmål, hvor der ikke kom nogen besvarelser i temmelig lang tid. Men ikke her :o[
Avatar billede steen_hansen Forsker
27. september 2007 - 21:16 #49
Prøver ...
Avatar billede steen_hansen Forsker
27. september 2007 - 21:23 #50
ADODB.Recordset error '800a0cc1'
Item cannot be found in the collection corresponding to the requested name or ordinal.

Det er denne linie:
Set pRS = Conn.Execute( strSQL )

SQL-forespørgslen:
strSQL = "SELECT points, AVG(points) AS AveragePoints FROM MinTabel WHERE ID2 = " & RS("ID2")
Avatar billede steen_hansen Forsker
27. september 2007 - 21:33 #51
Undskyld, fik henvist til forkert DB. Den er på plads nu. Nu får jeg

Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[MySQL][ODBC 3.51 Driver][mysqld-4.0.18-nt]Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause


Men GROUP BY er jo renset ud :/
Avatar billede steen_hansen Forsker
27. september 2007 - 21:37 #52
Hverken COUNT eller GROUP findes i dokumentet
Avatar billede snakeeye Nybegynder
27. september 2007 - 21:39 #53
jamen så smid  GROUP BY ID2 ind sammen med den.... gør ingen forskel
Avatar billede steen_hansen Forsker
27. september 2007 - 21:46 #54
Så er jeg ude i det samme igen, hvor jeg får en masse værdier trukket ud for hver fil, hvor der kun skal være gennemsnittet for den enkelte fil.
Avatar billede snakeeye Nybegynder
27. september 2007 - 21:49 #55
SELECT points, AVG(points) AS AveragePoints FROM MinTabel GROUP BY ID2 WHERE ID2 = " & RS("ID2")
Avatar billede steen_hansen Forsker
27. september 2007 - 21:52 #56
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[MySQL][ODBC 3.51 Driver][mysqld-4.0.18-nt]You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE ID2 = 1' at line 1

Prøver lige at udskrive strSQL
Avatar billede steen_hansen Forsker
27. september 2007 - 22:00 #57
Det fik jeg ikke så meget ud af:

DEBUG: SELECT points, AVG(points) AS AveragePoints FROM MinTabel GROUP BY vMovieID WHERE vMovieID = 1

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[MySQL][ODBC 3.51 Driver][mysqld-4.0.18-nt]You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE vMovieID = 1' at line 1
Avatar billede steen_hansen Forsker
27. september 2007 - 22:04 #58
Sorry, rettelse:

DEBUG: SELECT points, AVG(points) AS AveragePoints FROM MinTabel GROUP BY ID2 WHERE ID2 = 1

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[MySQL][ODBC 3.51 Driver][mysqld-4.0.18-nt]You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE ID2 = 1' at line 1
Avatar billede snakeeye Nybegynder
27. september 2007 - 22:08 #59
strSQL = "SELECT AVG(points) AS AveragePoints FROM MinTabel where id2 = " & rs("id2") & "43 group by id2"
Avatar billede steen_hansen Forsker
27. september 2007 - 22:19 #60
strSQL = "SELECT AVG(points) AS AveragePoints FROM MinTabel WHERE ID2 = " & RS("ID2") & " GROUP BY ID2"

- virker perfekt :) Smid et svar, snakeeye
Avatar billede snakeeye Nybegynder
27. september 2007 - 22:34 #61
hmmm.... det er godt nok en omvej vi har taget for at komme til dette svar og faktisk også kommet til svaret tidligere (næsten), anyway, svar :D
Avatar billede steen_hansen Forsker
27. september 2007 - 22:49 #62
Jeg en anelse om, at når den endelige løsning forelå, at det ville forekomme så logisk, så det gør helt ondt - og det gør det. Du skal simpelthen forgyldes med point, nye bedste ven :) 1000 tak for hjælpen :)
Avatar billede snakeeye Nybegynder
28. september 2007 - 17:02 #63
Jeg siger tak for point og tak for karma.
Og hvis det skulle være en anden gang :D

Jeg har dog på fornemmelsen jf. dit indledende spørgsmål og nu hvor løsningen er kommet ud, at du kan klarer det hele med kun 1 SQL sætning i stedet for 2. Men det må vi lige vente med :D
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
Kurser inden for grundlæggende programmering

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