Ranking / Punktesystem

Hallo zusammen,

ich stehe schon wieder vor einem kleinen Problem:
Ich möchte ein Verkaufsranking mit Punktesystem für Mitarbeiter erstellen.
Anzahl der Mitarbeiter = mögliche Punkte
Bsp:
Mitarbeiter1 hat 100 Stück verkauft
Mitarbeiter2 hat 10 Stück verkauft
Mitarbeiter3 hat 150 Stück verkauft.

Ziel sollte dann sein:
Mitarbeiter3, 150 Stück, 3
Mitarbeiter1, 100 Stück, 2
Mitarbeiter2, 10 Stück, 1

Jemand ne Idee?

Einfach eine passende Tabelle erstellen, die das definiert. Mit 9.2 würde ich da RANGA-Typen nehmen:

test=# create table punkte (stueck int4range, punkte int);
CREATE TABLE
test=*# insert into punkte values ('[0,10)',1);
INSERT 0 1
test=*# insert into punkte values ('[10,100)',2);
INSERT 0 1
test=*# commit;
COMMIT
test=# select punkte from punkte where stueck @> 5;
 punkte
--------
      1
(1 row)

test=*# select punkte from punkte where stueck @> 55;
 punkte
--------
      2
(1 row)

Oder was genau ist Dein Problem?


Andreas

Ausgehend von dieser Tabelle:

create table sales 
(
  emp_id       integer,
  items_sold   integer
);

insert into sales (emp_id, items_sold)
values
(1, 100),
(2, 10),
(3, 150);

commit;

geht das mit diesem Statement:

select emp_id, 
       dense_rank() over (order by items_sold desc) as rnk
from sales
order by 2 desc;

Ausgabe ist:

emp_id | rnk
-------+----
3      | 3  
1      | 2  
2      | 1

Das geht davon aus, dass jeder Mitarbeiter genau einmal in der Tabelle sales gespeichert ist.

Wird für jeden Verkausvorgang eine Eintrag in der Tabelle gemacht (die Anzahl verkaufter Stück ist also die Summe aller Einträge), dann müsste das so aussehen:

select emp_id, 
       dense_rank() over (order by total_sold desc) as rnk
from ( 
   select emp_id, 
          sum(items_sold) as total_sold
   from sales
   group by emp_id
) t
order by 2 desc;

Nach der Antwort von Castorp fürchte ich, ich hab dich falsch verstanden …


Andreas

Nach der Antwort von Castorp fürchte ich, ich hab dich falsch verstanden …


Andreas

Hm… jo :slight_smile:

Die Antwort von castorp hat mir weitergeholfen. Hier noch meine Testdaten und wie es bei mir nun geht.
In der Tabelle sind je Mitarbeiter mehrere Ziele definiert, Volumen und Anzahl sind bereits addiert. Manchmal sollen die Volumen, manchmal die Anzahl fürs Ranking zählen:

test=# select * from zieltest;
 mitarbeiter | anzahl | volumen |   ziel
---------+--------+---------+-----------
 0000001 |      1 |     100 | Klopapier
 0000002 |      2 |      30 | Klopapier
 0000003 |      3 |      50 | Klopapier
 0000001 |      1 |       1 | Stecker
 0000002 |    100 |      40 | Stecker
 0000003 |     80 |      10 | Stecker
(6 rows)

test=# select mitarbeiter, dense_rank() over (order by volumen ) as rank
test-# from ( select mitarbeiter, volumen from zieltest where ziel = 'Klopapier') as fred order by 2 desc;
 mitarbeiter | rank
---------+------
 0000001 |    3
 0000003 |    2
 0000002 |    1
(3 rows)

test=# select mitarbeiter, dense_rank() over (order by anzahl ) as rank
test-# from ( select mitarbeiter, anzahl from zieltest where ziel = 'Stecker') as fred order by 2 desc;
 mitarbeiter | rank
---------+------
 0000002 |    3
 0000003 |    2
 0000001 |    1
(3 rows)

test=#