Platzierung

mr.mc.mauser

Neuer Benutzer
Beiträge
4
Hallo,

ich habe ein kleines programm für Bogenturniere geschrieben.
Für die Siegerehrung benötigt man wie in jedem anderen Sport auch eine Platzierung.
Schützen mit 0 Punkten werden nicht gewertet.
Folgendes habe ich mit MYSQL umgesetzt:

SET @p = 0;
SELECT
*,
(`pkt1`+`pkt2`) as pkt_ges,
(`spot1`+`spot2`) as spot_ges,
IF((`pkt1`+`pkt2`) = 0, '', (@p := @p + 1) ) as `Platz`
FROM `schuetzen` where `bez`= 1
ORDER BY
pkt_ges DESC, kill_ges DESC


Damit bekommt man schön die plätze ausgegeben. Nur bei Punkt + Spot Gleichstand kommt Murks raus.
platz 1 = Fritz mit 10pkt, 5 Spot
platz 2 = Franz mit 10pkt, 4 Spot
platz 3 = Emil mit 10pkt, 4 Spot

platz 4 = Hugo mit 9pkt, 2 Spot

Jetzt hätte ich es auch gerne das wenn Punkt und Spot gleichstand gibt das es dann z.b. so aussieht

platz 1 = Fritz mit 10pkt, 5 Spot
platz 2 = Franz mit 10pkt, 4 Spot
platz 2 = Emil mit 10pkt, 4 Spot

platz 4 = Hugo mit 9pkt, 2 Spot
usw...

In der Verarbeitung der Daten in meinem Programm ist es kein problem.
Ich suche nach einer Reinen SQL Lösung.
Über sinn und Unsinn lässt sich streiten, es ist reines Interesse.

Gruß
Robert
 
Werbung:
nur um es mal kurz zu zeigen

Code:
test=*# select * from punkte ;
 name | punkte
------+--------
 max  |  10
 lisa |  8
 elli |  8
 paul |  6
(4 rows)

test=*# select *, rank() over (partition by 1 order by punkte desc), dense_rank() over (partition by 1 order by punkte desc) from punkte ;
 name | punkte | rank | dense_rank
------+--------+------+------------
 max  |  10 |  1 |  1
 lisa |  8 |  2 |  2
 elli |  8 |  2 |  2
 paul |  6 |  4 |  3
(4 rows)
 
Werbung:
Danke rank() war das Stichwort.....
Hab den Link von ukulele man Rank in MYSQL umsetzen kann.

Das kam dabei raus, und es Funktioniert...
Code:
SELECT *,
     (`pkt1`+`pkt2`) as pkt_ges,
     (`kill1`+`kill2`) as kill_ges,
     IF(
       (`pkt1`+`pkt2`) = 0, '',
       IF(
         (
           (pkt1+pkt2)*1000+kill2+kill1)= @_lastplatz,
           @curRank:=@curRank,
           @curRank:=@_sequence
         )
     ) AS platz,
     @_sequence:=@_sequence+1,
     @_lastplatz:=((pkt1+pkt2)*1000+kill2+kill1)
FROM
   schuetzen,
   (
     SELECT @curRank := 1,
     @_sequence:=1,
     @_lastplatz:=0
   ) r
ORDER BY
   pkt_ges DESC,
   kill_ges DESC

Ohne das * 1000 klappt es nicht
Gruß
Robert
 
Zurück
Oben