Avatar billede haase Nybegynder
08. marts 2004 - 22:14 Der er 18 kommentarer

AVG og Count

Hej,

følgende SQL-forespørgsel skal kunne udregne gennemsnittet af antal stjerner (CDCommentStars) + tælle antallet af kommentarer, men jeg kan ikke få det til at virke...


SELECT DISTINCT avg(tblCDComment.CDCommentStars) AS AvgStars, CountRows(tblComment)  tblCD.*, tblCDCat.*, tblCDComment.*,  FROM tblCD, tblCDCat, tblCDComment  WHERE tblCD.CDCat = tblCDat.CDCatID AND tblCDComment.CDCommentCDID = tblCD.CDID  ORDER BY CDTitle

/haase
Avatar billede trer Nybegynder
08. marts 2004 - 23:09 #1
AVG() og tilsvarende skal du bruge sammen med en group by.

fx

select varenavn, count(*), avg(salgspris), max(salgspris), min(salgspris)
from ordrer
group by varenavn.
Avatar billede haase Nybegynder
09. marts 2004 - 08:39 #2
ok - her er min nye forespørgsel.

men den skal også hente alle poster i tabellen tblcd og tblcat.
samt at den skal sortere efter cdtitle...

strSQL = "SELECT avg(CDCommentStars), count(*) " 
strSQL = strSQL & "FROM tblCDComment, tblCD, tblCDCat "
strSQL = strSQL & "WHERE tblCD.CDCat = tblCDat.CDCatID "
strSQL = strSQL & "AND tblCDComment.CDCommentCDID = tblCD.CDID "
strSQL = strSQL & "GROUP BY CDCommentStars"

/haase
Avatar billede trer Nybegynder
09. marts 2004 - 08:51 #3
tilføj en ORDER BY efter GROUP BY og de felter du skal have ud fra de øvrige tabeller. Eneste ulempe er, at du kun kan få de felter (kolonner) ud i "tekst" som du vælger at gruppere på eller benytte aggrerede funktioner på (AVG, MAX, MIN etc).
Avatar billede haase Nybegynder
09. marts 2004 - 09:15 #4
strSQL = "SELECT avg(CDCommentStars), count(*) " 
strSQL = strSQL & "FROM tblCDComment, tblCD, tblCDCat "
strSQL = strSQL & "WHERE tblCD.CDCat = tblCDat.CDCatID "
strSQL = strSQL & "AND tblCDComment.CDCommentCDID = tblCD.CDID "
strSQL = strSQL & "GROUP BY CDCommentStars, cdcommentstars, cdtitle, cdid, cdcatid, cdcattitle, cdcommentid, cdcommentcdid, cdcoverfilesmall "
strSQL = strSQL & "ORDER BY CdTitle ASC"

men nu får jeg fejlen:

ADODB.Recordset (0x800A0CC1)
Item cannot be found in the collection corresponding to the requested name or ordinal.
Avatar billede trer Nybegynder
09. marts 2004 - 09:21 #5
strSQL = "SELECT CDCommentStars, cdcommentstars, cdtitle, cdid, cdcatid, cdcattitle, cdcommentid, cdcommentcdid, cdcoverfilesmall, avg(CDCommentStars) as avgstars, count(*) as antal " 
strSQL = strSQL & "FROM tblCDComment, tblCD, tblCDCat "
strSQL = strSQL & "WHERE tblCD.CDCat = tblCDat.CDCatID "
strSQL = strSQL & "AND tblCDComment.CDCommentCDID = tblCD.CDID "
strSQL = strSQL & "GROUP BY CDCommentStars, cdcommentstars, cdtitle, cdid, cdcatid, cdcattitle, cdcommentid, cdcommentcdid, cdcoverfilesmall "
strSQL = strSQL & "ORDER BY CdTitle ASC"
Avatar billede haase Nybegynder
09. marts 2004 - 09:31 #6
jeps nu virker det, men den viser kun de poster hvori der er comments og der også dubletter...
Avatar billede haase Nybegynder
09. marts 2004 - 09:33 #7
strSQL = "SELECT CDCommentStars, cdtitle, cdid, cdcatid, cdcat, cdcattitle, cdcommentid, cdcommentcdid, cdcoverfilesmall, cdartist, avg(CDCommentStars) as avgstars, count(*) as antal " 
strSQL = strSQL & "FROM tblCDComment, tblCD, tblCDCat "
strSQL = strSQL & "WHERE tblCD.CDCat = tblCDCat.CDCatID "
strSQL = strSQL & "AND tblCDComment.CDCommentCDID = tblCD.CDID "
strSQL = strSQL & "GROUP BY CDCommentStars, cdtitle, cdcat, cdid, cdcatid, cdcattitle, cdcommentid, cdcommentcdid, cdcoverfilesmall, cdartist "
strSQL = strSQL & "ORDER BY CdTitle ASC"
Avatar billede haase Nybegynder
09. marts 2004 - 09:33 #8
kan man bruge DISTINCT?
Avatar billede trer Nybegynder
09. marts 2004 - 09:33 #9
Der er ikke dubletter i en GROUP BY - der vil være forskel i en af de kolonner du grupperer på.  At den kun viser de poster hvori der er comments kan hænge sammen med en inner join.
Avatar billede trer Nybegynder
09. marts 2004 - 09:38 #10
Du kan skrive din inner join om til en outer join for at få dine data ud. Nemmeste er at starte med at få en simpel select til at returnere de rækker du er interesseret i og efterfølgende skrive den om til en group by

step1:

select felt, felt, felt
from tabel1 left outer join tabel2
on fk=pk


step2:
select felt, felt, avg(felt), count(*)
from tabel1 left outer join tabel2
on fk=pk
group by felt, felt
order by felt
Avatar billede haase Nybegynder
10. marts 2004 - 11:25 #11
Hej igen,

Nu ser det såen her ud - men virker stadig ikke:

Error Type:
Microsoft JET Database Engine (0x80040E14)
Syntax error in FROM clause.


strSQL = "SELECT  tblCDComment.CDCommentStars, tblCD.cdtitle, tblCD.cdid, tblCDCat.cdcatid, tblCD.cdcat, tblCDCat.cdcattitle, tblCDComment.cdcommentid, tblCDComment.cdcommentcdid, tblCD.cdcoverfilesmall, tblCD.cdartist, avg(CDCommentStars) AS AVGStars, COUNT(*) AS Antal "
strSQL = strSQL & "FROM tblCDComment "
strSQL = strSQL & "LEFT OUTER JOIN tblCD, tblCDCat "
strSQL = strSQL & "ON tblCD.CDCat = tblCDCat.CDCatID "
strSQL = strSQL & "AND tblCDComment.CDCommentCDID = tblCD.CDID "
strSQL = strSQL & "GROUP BY tblCDComment.CDCommentStars, tblCD.cdtitle, tblCD.cdid, tblCDCat.cdcatid, tblCD.cdcat, tblCDCat.cdcattitle, tblCDComment.cdcommentid, tblCDComment.cdcommentcdid, tblCD.cdcoverfilesmall, tblCD.cdartist "
strSQL = strSQL & "ORDER BY tblCD.CdTitle ASC"
Avatar billede haase Nybegynder
10. marts 2004 - 11:26 #12
jeg har tjekket w3schools.com ud - men det hjælper ikke...

http://www.w3schools.com/sql/sql_join.asp
Avatar billede trer Nybegynder
10. marts 2004 - 11:34 #13
Kan du prøve at poste et eks på de data du har i tabellerne og hvad output du ønsker?
Avatar billede haase Nybegynder
10. marts 2004 - 11:48 #15
Avatar billede haase Nybegynder
10. marts 2004 - 11:52 #16
ønsket output

http://www.henriklutzen.dk/output.gif

den skal tælle hvor mange anmeldelser der er til pågældende cd
og beregne gennemsnittet af antal stjerner...
Avatar billede trer Nybegynder
10. marts 2004 - 12:56 #17
Jeg tror det nemmeste bliver at lave en subselect (inline view) der beregner dine gennemsnit etc - og så benytte den i en almindelig join.

Således

select *
from tblcd inner join
(select cdid, avg(cdcommentstars) as stars, count(*) as antal
from tblcd c left outer join tblcdcomment t
on cdid = cdcommentcdid
group by cdid) as rating
on tblcd.cdid = rating.cdid
inner join tblcat
on tblcd.cdcat = tblcat.cdcatid
order by tblcd.cdtitle
Avatar billede haase Nybegynder
13. marts 2004 - 16:45 #18
hmm - jeg kan ikke få det til at virke...

og hvorfor står der: rating.cdid

select *
from tblcd inner join
(select cdid, avg(cdcommentstars) as stars, count(*) as antal
from tblcd left outer join tblcdcomment
on cdid = cdcommentcdid
group by cdid) as rating
on tblcd.cdid = rating.cdid,
inner join tblcat
on tblcd.cdcat = tblcat.cdcatid
order by tblcd.cdtitle


jeg får denne fejlmeddelelse:

Microsoft JET Database Engine (0x80040E14)
Syntax error in FROM clause.
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