webForumDet fria alternativet

Access 2003: Hämta 10 posterna med högst betyg

Databaser & SQLur Databashanterare & SQL

14 svar · 541 visningar · startad av Mattias Nordin

Mattias NordinMedlem sedan dec. 20051 056 inlägg
#1

Hej.

Skulle behöva få hjälp med en sql fråga som tar ut TOP 10 med högst snittbetyg från min databas

I tabellen sparar jag antalet rösttillfällen och det totala resultatet. Så här visar jag resultatet.

varVoteResult = varVoteTotal / varVoteTimes	
<%=left(varVoteResult,3)%> (<%=varVoteTimes%> votes) &nbsp;
<% for i = 1 to varVoteResult %>
<img src="ico_plus.gif" align="absmiddle">
<% next %>

Vill alltså få ut ett recordset med de tio bästa.

Peter SMedlem sedan dec. 20025 483 inlägg
#2

Hej!

Följ gärna @nders guide (y)

Mattias NordinMedlem sedan dec. 20051 056 inlägg
#3

Hmmm... förstår inte vad du menar.

Har inte någon aning om hur syntaxen för något sådant ska se ut men jag antar att det går att göra. Tänker mig något enligt nedan.

sql = "SELECT TOP 10 * FROM T_mediainfo "
sql = sql &" LEFT JOIN T_movie_poster ON T_mediainfo.id = T_movie_poster.movie_id"
sql = sql &" WHERE visa_lank = true ORDER BY [b](vote_total / vote_times)[/b] DESC, T_mediainfo.id"

Microsoft JET Database Engine error '80040e57'

Overflow

Peter SMedlem sedan dec. 20025 483 inlägg
#4

Så här menar jag (exempel):

DBMS
MS Access 2000

Tabellstruktur/-innehåll
Tabell_1

[B]  pnr (char(10), PK)  |  namn (varchar(50))  |  ort (varchar(30))[/B]
-----------------------------------------------------------------
  4605013490          |  per persson         |  byn
-----------------------------------------------------------------
  7011165622          |  lisa karlsson       |  staden
-----------------------------------------------------------------

Tabell_2

[B]  pnr (char(10), PK, FK Tabell_1.pnr)  |  hobby (varchar(50), PK))[/B]
------------------------------------------------------------------
  4605013490                           |  fotboll
------------------------------------------------------------------
  4605013490                           |  knyppling
------------------------------------------------------------------
  7011165622                           |  statistik
------------------------------------------------------------------

Önskat resultat

  pnr         |  namn           |  antal_hobbys
-----------------------------------------------
  4605013490  |  per persson    |  2
-----------------------------------------------
  7011165622  |  lisa karlsson  |  1
-----------------------------------------------

Testad SQL-fråga och resultat
SQL-fråga

select t1.pnr
     , t1.namn
     , count(*) as antal_hobbys
  from Tabell_1 t1
 left
  join Tabell_2 t2
    on t1.pnr = t2.pnr
group
    by t1.pnr

Resultat

Du försökte köra en fråga med en mängdfunktion som inte innehöll det angivna uttrycket 'namn'.
Mattias NordinMedlem sedan dec. 20051 056 inlägg
#5

Hade glömt bort detta men nu är det dags att åter ta ett litet krafttag.

Går det att göra lite division direkt i en sql fråga?

Det jag vill åstakomma är:

vote_total / vote_times AS voteResult

och sortera hela mitt recordset på voteResult.

tabellen skrev:

T_media
------------------------------
id | vote_total | vote_times

Önskat resultat skrev:

3,12
3,00
2,8
1

Mattias NordinMedlem sedan dec. 20051 056 inlägg
#6

Ingen sql guru här ?

@ndersMedlem sedan juni 200032 969 inlägg
#7

select votetotal / vote_times as voteresult
order by 1 desc

Mattias NordinMedlem sedan dec. 20051 056 inlägg
#8

Hej Anders! :)
Det var ungefär så jag hoppades att man skulle kunna göra.

Min sqlfråga ser numer ut så här:

sql = "SELECT TOP 10 *, vote_total / vote_times as voteresult FROM T_mediainfo "
	sql = sql &" LEFT JOIN T_movie_poster ON T_mediainfo.id = T_movie_poster.movie_id"
	sql = sql &" WHERE visa_lank = true AND NOT vote_total is null ORDER BY voteresult desc, T_mediainfo.id"

Och ger följande fel

Microsoft JET Database Engine error '80040e10'

No value given for one or more required parameters.

Mattias NordinMedlem sedan dec. 20051 056 inlägg
#9

Hmm...

kör jag bara

SELECT vote_total / vote_times as voteresult FROM T_mediainfo ORDER BY 1 DESC

så får jag...

Microsoft JET Database Engine error '80040e57'

Overflow

Tydligen så är både vote_total och cote_times null i vissa fält. Hur testar jag det?

@ndersMedlem sedan juni 200032 969 inlägg
#10

Vad är det för datatyper på fälten?`

Ang. felmeddelandet i ditt näst sista inlägg: du kan inte ange namnet på ett skapat fält i order by, utan du måste ange dess ordningsnummer, som jag gjorde i mitt exempel.

Mattias NordinMedlem sedan dec. 20051 056 inlägg
#11

hmmm... datatypen på båda fälten är numeriska.

Mattias NordinMedlem sedan dec. 20051 056 inlägg
#12
SELECT *, vote_total / vote_times as voteresult FROM T_mediainfo ORDER BY 1 DESC

Hur gör man för att exkludera att göra en division på de fält som är null ?

Var kan man läsa mer om vilka kommandon som är giltiga i en sql fråga? Antar att man inte kan köra vb-script rakt av.

@ndersMedlem sedan juni 200032 969 inlägg
#13

Hur gör man för att exkludera att göra en division på de fält som är null ?

... WHERE fält IS NOT NULL

Var kan man läsa mer om vilka kommandon som är giltiga i en sql fråga?

Till exempel hos devguru.

Mattias NordinMedlem sedan dec. 20051 056 inlägg
#14

Hej Anders :)

Jag vill returnera alla rader.
De rader som var_total och vote_times båda är något annat annat än null så ska även "vote_total / vote_times as voteresult" köras

Typ:
SELECT *, if not vote_total is null and not vote_times is null then vote_total / vote_times as voteresult end if FROM T_mediainfo ORDER BY 1 DESC

hmmm...

Nu är jag ju erkännt dum igen. Visst går det utmärkt att lägga på where... då jag bara vill ha ut top 10. :r

Mattias NordinMedlem sedan dec. 20051 056 inlägg
#15

Nähä...

Det vara inte alla nullfält som ställer till det för mig.

Nu kör jag:

sql = "SELECT vote_total / vote_times as voteresult FROM T_mediainfo
 WHERE vote_total IS NOT NULL AND vote_times IS NOT NULL 
ORDER BY 1"

Och så fort jag lägger på ORDER BY 1 så får jag:

Microsoft JET Database Engine error '80040e57'

Overflow

RED...

Ändrade till:

WHERE vote_total > 0 AND vote_times > 0

och det fungerar nu. Tack för assistansen alla. Frustrerande när man fastnar på bagateller pga sin okunskap. Tjing!

138 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)