har en db där röster för olika saker sparas. Att sedan räkna ut medel för en specifik sak är ju inga problem då jag bara hämtar alla röster (värdet för alla röster) för en speciell sak och sedan delar med antalet röster. Då jag däremot vill lista exempelvis de tio sakerna med högst medelröst vet jag inte hur jag skall göra. Går detta att göra direkt i sql-frågan på något vis?
alternativet är ju att hämta allt, räkna ut medel för alla saker och sedan plocka ut de som har högst medelvärde.. blir väldigt omständigt men det kanske är ända sättet, eller??
Om du har en kolumn som heter votesX och en som heter votesR, där votesX är antalet röster, och votesR är resultatet av alla röster, så kan du köra en SQL-fråga enligt denna syntax:
SELECT Top 10 falt1,falt2,falt3,.. FROM tabell ORDER BY (votesR/votesX) DESC
yohpopsMedlem sedan feb. 20011 198 inlägg Testa detta.
select top 10 thingid,thingname,(select avg(count(*)) from counts c where c.thingid = c2.thingid) [AvgCounts] from counts c2 order by AvgCounts desc
tydalMedlem sedan juni 20034 013 inlägg Nu vet jag inte vilken databas du använder, men i Mysql kan man skriva så här:
SELECT voteID, AVG(vote) AS medel FROM votes GROUP BY voteID ORDER BY medel DESC LIMIT 10
där då voteID är det värde som identifierar saken och vote är värdet på rösten.
LarsGMedlem sedan dec. 200012 464 inlägg Hur ser tabellen ut?
Ange lite datainnehåll också.
Flyttas från ASP
kanske är otydlig som vanligt, använder access. db ser ut :
rost_ID (nyckel)
anvandar_ID
sak_ID
rostvarde
jag har det på detta vis för att en enskiljd användare skall kunna ändra sin röst och endast rösta en gång på varje sak.
jag vill alltså plocka ut de sak_ID som har högst medelvärde, dvs alla röstvärden/ antal röster
tydalMedlem sedan juni 20034 013 inlägg SELECT TOP 10 sak_ID, AVG(rostvarde) AS medel GROUP BY sak_ID ORDER BY medel DESC
SELECT TOP 10 sak_ID, AVG(rostvarde) AS medel from tabell GROUP BY sak_ID ORDER BY medel DESC
from tabell skall vara med också =) jag får den att plocka ut rätt tror jag men jag verkar inte kunna sortera efter medel. Tar jag bort order by medel desc så fungerar det fast det blir ju inte sorterat. vad kan vara felet med detta??
Too few parameters. Expected 1
LarsGMedlem sedan dec. 200012 464 inlägg SELECT TOP 10 sak_ID, AVG(rostvarde) AS medel
from tabell
GROUP BY sak_ID
ORDER BY 2 DESC
det verkar funka jättebra, tackar så väldigt!! vad står dock tvåan för?
LarsGMedlem sedan dec. 200012 464 inlägg 2 ==> andra uttrycket i select-listan.
två saker till när jag ändå håller på.
1. hur får jag med allt från tabellen och inte bara sak_ID?
2. hur avrundar jag värdet medel till en decimaler. jag vet ju inte om alla medeltal kommer att ha några decimaler?
LarsGMedlem sedan dec. 200012 464 inlägg Hur skulle du kunna få med något annat?
t.ex. om data i tabellen ser ut
rost_id | sak_id | anvandar_id | rost
-----------------------------------------------
1 | 1 | 1| 5
2 | 1 | 2| 4
3 | 1 | 3| 3
Eftersom det finns flera värden för varje sak_id så går det inte att få ihop till en rad. Jag förstår inte hur du menar.
round(AVG(rostvarde+0.0) ,1)
om sqlfrågan ser ut som du skrev:
SELECT TOP 10 sak_ID, AVG(rostvarde) AS medel
from tabell
GROUP BY sak_ID
ORDER BY 2 DESC
så får jag väl med sak_id för de tio med högst medel samt dess medelvärde, men inte användar_ID för respektive sak eller om jag ex vill göra såhär:
SELECT TOP 10 tabell.sak_ID,tabell2.*, AVG(tabell.rostvarde) AS medel
from tabell, tabell2 where tabell.sak_ID=tabell2.sak_ID
GROUP BY tabell.sak_ID
ORDER BY 3 DESC
behöver saker från andra tabeller också. vill helst göra detta med en sqlsats.
LarsGMedlem sedan dec. 200012 464 inlägg Ok, det var en häst med en annan färg.
Du får skriva ut alla kolumner som du vill ha från tabell2 (dvs använd inte *) och även ta med dessa i group by.
jippie.. funkar stabilt!! grymt stort tack!!