webForumDet fria alternativet

Poäng, Placering och tidigare plats

ASP

11 svar · 186 visningar · startad av Janspeed

Medlem sedan jan. 2001510 inlägg
Frågan#1

Tjena!

Håller på med en tävling och har fått en tabell med deltagarnas namn, ort, poäng och tidigare poäng.

Det jag undrar nu är om det finns något fiffigt sätt att låta SQL-servern automatiskt räkna ut poängplacering och tidigare poängplacering genom en SQL-sats?

Placeringen måste funka även om jag sorterar efter namn eller ort.

Det jag helst skulle vilja är att placeringen kommer med i sökresultatet från SQL-satsen så jag kan loopa ut resultatet men alla förslag är ju givetvis välkommna.

Tacksam för svar. :)

//JANspeed

Medlem sedan dec. 200012 464 inlägg
#2

Det är svårt (jag tror inte att det går) att få ihop med en sql-sats.

Man får nog snickra ihop en procedur och då gjorde jag det.

Den förusätter att man har en tabell, js

create table js(namn char(12),ort char(12),p int,tp int,primary key (namn))

Det är den som innehåller grunddatat.
p=poäng
tp = tidigare poäng

Skriptet skapar en tabell som inneåller två kolumner till, en för nuvarande rankning och en för tidigare

create table jst(namn char(12),ort char(12),p int,tp int, rank int,trank int)

create procedure jsort as
  
  begin
    declare @rank int
    declare @p,@a int

    declare a cursor for select p,count(*) from js group by p order by p desc
    declare b cursor for select tp,count(*) from js group by tp order by tp desc

    insert into jst select namn,ort,p,tp,0,0 from js

    set @rank = 1
    open a

    fetch a into @p,@a
    while ( @@fetch_status = 0 )
    begin
       update jst set rank = @rank where p = @p
       set  @rank = @rank + @a
       fetch a into @p,@a
   end
   close a

    set @rank = 1
    open b
    fetch b into @p,@a
    while ( @@fetch_status = 0 )
    begin
       update jst set trank = @rank where tp = @p
       set  @rank = @rank + @a
       fetch b into @p,@a
    end 
    close b

Om två eller flera har samma poäng så delar de plats.

Efter att du har anropat proceduren så kan du bara selecta från tabellen jst.

(Jag skrev och testade detta med en dbms som använder standard-SQL för stored procedures och inte T-sql. Jag gjorde en otestad översättning från PSM till T-SQL då jag inte har någon SQL server lätt tillgänglig.)

------------------
essentitia preter non sans multiplicandum

Medlem sedan jan. 2001510 inlägg
#3

Ok. Om jag skulle räkna ut poängen på själva sidan då? Hur skulle man kunna göra det smidigt?

Medlem sedan dec. 200012 464 inlägg
#4

Nu förstår jag inte. Vad menar du med att beräkna poäng.

Menar du att du har allt data i en array/recordset och vill göra beräkningarna i VB-script?

------------------
essentitia preter non sans multiplicandum

Medlem sedan jan. 2001510 inlägg
#5

Jag är inte riktigt säker själv. I och med att det då troligtvis inte går att göra i SQL Server så får jag väl komma på nått annat sätt att lösa det på?

Hur skulle ni göra om ni Hade namn, ort, poäng och tidigare poäng och ville veta placering och hur många steg man stigit eller sjunkit på listan?

En idé är ju att skapa en särskild sida som får räkna ut allt och sedan uppdatera i databasen? Men då måste man ju köra den sidan varje gång man uppdaterar databasen.

Någon som har ett förslag?

/JANspeed

Medlem sedan dec. 200012 464 inlägg
#6

Du kan ju skapa en trigger som anropar den procedur som jag skrev.

I så fall får du lägga till i den proceduren att man först tar bort alla poster från tabellen jst.

------------------
essentitia preter non sans multiplicandum

Medlem sedan jan. 2001510 inlägg
#7

Problemet är att jag inte kan så mycket om procedurer och vet inte riktigt hur man använder dem. :)

Så jag tänkte att det säkert borde finnas någon som har gjort ett rankingsystem på ett annat sätt? Jag tycker liksom jag sett en sån massa sådana.

Skulle det visa sig dock att det är det enda sättet så får jag väl sätta mig ner och lära mig det. :)

/JANspeed

Medlem sedan dec. 200012 464 inlägg
#8

Att anropa en procedur från asp är lika enkelt som att anropa andra sql-statement

sql = "execute jsort"
connect.execute sql,,128

för att anropa en procedur som inte retunerar något resultat. Om den har ett resultat så är det helt analogt med att utföra en select

'anropa en procedur 
' med två inparametrar
' och ett resultat

sql = "exec procedure_with_result 3,'A'"
set rs = connect.execute(sql)
while not rs.eof
'skriv ut
  rs.movenext
wend

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 05 sep 2001]

Medlem sedan jan. 2001510 inlägg
#9

Jo, jag vet hur man anropar en procedur men då förutsätter det ju att proceduren finns där från början eller att någon skapar den. Det är ju det som är problemet. Samt accessen till databasen. :)

Därför föredrar jag att jobba med placeringarna på själva sidan eller via den sql-sats som hämtar uppgifterna.

Jag kan också räkna ut allting en gång vid varje uppdatering som sker men då blir det ju en uppgift som jag måste komma ihåg att göra så därför vore det bästa om allt skedde automatiskt. :)

/JANspeed

Medlem sedan jan. 2001510 inlägg
#10

Var det ingen som hajade vad jag är ute efter eller är det ingen som gjort ett ranking-system på annat sätt än via en procedur? :q

/JANspeed

Medlem sedan jan. 2001510 inlägg
#11

Nähä. Det vara bara Ignorera-JANspeed-dagen. Då förstår jag. :(

/JANspeed

Medlem sedan dec. 200012 464 inlägg
#12

Just det, men nu är det en ny dag.

Jag kom på en lösning


  select namn,ort,p,tp,
    (select count(*) + 1 from js
      where p > js2.p) as rank,
    (select count(*) + 1 from js
      where tp > js2.tp) as trank
    from js as js2
   order by namn

om man har samma tabelldefinition som i mitt första inlägg.

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 08 sep 2001]

254 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)