Avatar billede CRavnkilde Nybegynder
12. marts 2009 - 11:07 Der er 18 kommentarer og
1 løsning

Select count - flere af dem

Jeg vil tælle antallet af poster i en db og vise antallet på en side. Jeg vil tælle flere forskellige poster, eks. antal deltagere total og antal deltagere i en bestemt kategori på en gang.

Min kode:
set dbCountTotal = objConn.Execute("select count(*) as otal from Participants WHERE Attending='Yes'")
set dbCountTotal = objConn.Execute("select count(*) as walking from Participants WHERE Participants.Attending='Yes' AND Participants.LeisureActivity='1. Nordic walking'")

Jeg viser resultatet med:
<% response.write ("<b>" & dbCountTotal("total") & "</b>") %>
<% response.write ("<b>" & dbCountTotal("walking") & "</b>") %>

Problemet er at jeg ikke kan køre begge forespørgsler på én gang uden at den melder fejl:
Item cannot be found in the collection corresponding to the requested name or ordinal.

Kan nogen hjælpe med en løsning? Pft.
Avatar billede apocs Nybegynder
12. marts 2009 - 11:48 #1
Grunden til det, er at du kalder din SQL streng det samme. Opret to forskellige, og to forskellige recordsets, så skulle det virke :)
Avatar billede softspot Forsker
12. marts 2009 - 11:48 #2
Det er fordi du lægger resultatet over i samme variabel og dermed overskriver den første forespørgsel inden du har aflæst resultatet af den. Det kan du lade være med, så burde de fungerer...

Alternativt kan du lave begge optællinger i samme forespørgsel som subqueries:

sql = "SELECT " & _
  "(SELECT COUNT(*) FROM participants WHERE attending = 'yes') AS total, " & _
  "(SELECT COUNT(*) FROM participants WHERE atending = 'Yes' " & _
  "AND leisureActivity = '1. Nordic walking) AS walking "

set rs = objConn.Execute(sql)

response.write rs("total") & "<br>"
response.write rs("walking") & "<br>"
Avatar billede CRavnkilde Nybegynder
12. marts 2009 - 12:08 #3
OK, softspot. Rettede lige koden lidt til:

sql = "SELECT " & _
"(SELECT COUNT(*) FROM participants WHERE attending = 'Yes') AS total, " & _
"(SELECT COUNT(*) FROM participants WHERE attending = 'Yes' " & _
"AND LeisureActivity = '1. Nordic walking') AS walking")

set rs = objConn.Execute(sql)


Men den giver fejl:
Error Type:
Microsoft VBScript compilation (0x800A0401)
Expected end of statement
/conferenceservice2/event/10360_Nycomed/count_reports.asp, line 18, column 55
"AND LeisureActivity = '1. Nordic walking') AS walking")
Avatar billede softspot Forsker
12. marts 2009 - 12:16 #4
Ja, der skal ikke være parantes til sidst i din SQL-sætning...

sql = "SELECT " & _
"(SELECT COUNT(*) FROM participants WHERE attending = 'Yes') AS total, " & _
"(SELECT COUNT(*) FROM participants WHERE attending = 'Yes' " & _
"AND LeisureActivity = '1. Nordic walking') AS walking"
Avatar billede softspot Forsker
12. marts 2009 - 12:17 #5
...eller rettere EFTER SQL-sætningen :-)
Avatar billede CRavnkilde Nybegynder
12. marts 2009 - 12:58 #6
senste kode giver: 


Microsoft OLE DB Provider for ODBC Drivers (0x80004005)
[Microsoft][ODBC Microsoft Access Driver] Reserved error (|); there is no message for this error.
Avatar billede softspot Forsker
12. marts 2009 - 13:02 #7
Det kan være fordi Access ikke kan lave en select uden der er angivet en FROM-clause. Prøve evt. at tilføje FROM-clause med et vilkårligt (eksisterende) tabelnavn. Eksempelvis:

sql = "SELECT " & _
"(SELECT COUNT(*) FROM participants WHERE attending = 'Yes') AS total, " & _
"(SELECT COUNT(*) FROM participants WHERE attending = 'Yes' " & _
"AND LeisureActivity = '1. Nordic walking') AS walking " & _
"FROM participants"
Avatar billede softspot Forsker
12. marts 2009 - 13:10 #8
For at begrænse resultatet skal du nok sørge for kun at læse den første række (eller kommer der et resultat for hver række i tabellen):

sql = "SELECT TOP 1 " & _
"(SELECT COUNT(*) FROM participants WHERE attending = 'Yes') AS total, " & _
"(SELECT COUNT(*) FROM participants WHERE attending = 'Yes' " & _
"AND LeisureActivity = '1. Nordic walking') AS walking " & _
"FROM participants"
Avatar billede CRavnkilde Nybegynder
12. marts 2009 - 13:21 #9
For at gøre det lidt mere overskueligt, har jeg valgt flg. løsning:

set dbCountTotal = objConn.Execute("select count(*) as total from Participants WHERE Attending='Yes'")
set dbCountWalking = objConn.Execute("select count(*) as Walking from Participants WHERE Participants.Attending='Yes' AND Participants.LeisureActivity='1. Nordic walking'")
set dbCountCity = objConn.Execute("select count(*) as City from Participants WHERE Participants.Attending='Yes' AND Participants.LeisureActivity='2. City sightseeing tour'")
set dbCountRacing = objConn.Execute("select count(*) as Racing from Participants WHERE Participants.Attending='Yes' AND Participants.LeisureActivity='3. Nycomed Racing Trophy'")

Og det virker efter hensigten. Alle jer, der har deltaget, kan lægge et svar og få nogle points for jeres ulejlighed. TAKKER!
Avatar billede softspot Forsker
12. marts 2009 - 13:23 #10
OK, men den sidste udgave jeg viste fungerer i access.

Anyway! Velbekomme :-)
Avatar billede softspot Forsker
12. marts 2009 - 13:29 #11
NB: Det er i øvrigt  bedre, rent performancemæssigt, at lave én forespørgsel til databasen end 3, både f.s.v.a. trafikmængde og hastighed... men det er der nok ikke noget nyt i :-)
Avatar billede softspot Forsker
12. marts 2009 - 13:29 #12
Og så skulle man vist markere "Svar" inden man sender sit svar ;D
Avatar billede CRavnkilde Nybegynder
12. marts 2009 - 14:08 #13
OK, softspot. Jeg bruger dit forslag alligevel.
Avatar billede softspot Forsker
12. marts 2009 - 14:15 #14
Yeeah! Endnu en frelst sjæl :D

Tak for point :)
Avatar billede CRavnkilde Nybegynder
25. marts 2009 - 11:49 #15
Jeg er tilbage softspot! Hvad hvis databasen er tom, så melder den fejl.

Jeg udskriver antallet med:
Total No. of participants: <% response.write ("<b>" & rs("total") & "</b>") %>

Skal jeg have noget "If Not (objRs.BOF Or objRs.EOF) Then" ind der?

Jeg kan åbne spørgsmålet og tildele dig nogle pts der.
Avatar billede softspot Forsker
25. marts 2009 - 12:07 #16
Du kan godt nøjes med at tjekke på rs.eof, men ellers er det korrekt at du (blandt andet) altid bør kontrollere, om der er blevet returneret nogle rækker inden du begynder at læse dem...

Derfor er denne linie tilstrækkelig inde du læser fra recordsettet:

If Not objRs.EOF Then
  ' læse det total antal fra recordsettet...
Else
  ' Fejlmeld... eller hvad du nu har tænkt dig at gøre :-)
End If
Avatar billede CRavnkilde Nybegynder
25. marts 2009 - 14:46 #17
Jamen, det spiller også bare. Tak, softspot. Skal jeg lige oprette et spørgsmål som du kan svare på og få nogle pts?
Avatar billede softspot Forsker
25. marts 2009 - 15:30 #18
Nej, det er ligegyldigt - it's on the house maaan ;D

Velbekomme! :)
Avatar billede CRavnkilde Nybegynder
25. marts 2009 - 21:25 #19
1000 tak, softspot :-)
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