12. marts 2009 - 11:07Der 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'")
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.
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
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 "
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")
Microsoft OLE DB Provider for ODBC Drivers (0x80004005) [Microsoft][ODBC Microsoft Access Driver] Reserved error (|); there is no message for this error.
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"
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!
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 :-)
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
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.