1

次の2つのテーブルがあります。

ここに画像の説明を入力

USERID を入力すると、ランキングを取得できるプロシージャ/関数を作成したいと考えています。ランキングは、合計ランク ポイントにトークンを掛けて、ユーザーが獲得した合計トークンで割った値に基づいています。

ランクに相当する数値は次のとおりです: SU = 25、EX = 9、VG = 5、G = 3、F = 1

たとえば、私のデータに基づくと、userid 45 のランキングは = [25(4) + 3(5)]/4 + 5 = 12.77 (私の出力になります)

これが私の試みです...数学の部分を台無しにしました。「ユーザーランキングは次のとおりです:」(空白/ランキングの値なし)と表示されます

create or replace procedure rank
(para_userid IN number, para_ranking OUT number)
is
    n number;
    rank number;
    r number;
CURSOR c1(uid number) IS 
        select decode(rank, 'SU', 25, 'EX', 9, 'VG', 5, 'G', 3, 'F',1) FROM A
            WHERE para_userid= uid;    
begin
        n := 0;
        para_ranking := 0;
        OPEN c1(para_userid);
        LOOP 
            FETCH c1 INTO rank; 
            EXIT WHEN c1%NOTFOUND;     
            r := r * rank; 
            n := n + 1; 
        END LOOP; 
        IF n > 0 THEN 
            para_ranking := r / n; 
        END IF; 
        CLOSE c1; 
    END; 


declare 
x number;
begin
rank(45, x);
DBMS_OUTPUT.PUT_LINE('User Ranking is: '||x);
end;
/
4

1 に答える 1

2

すべてのユーザーランキングを取得するクエリを次に示します。これを単一のユーザーに制限してプロシージャに入れるのは簡単です。

Select
    a.userid,
    Sum(decode(a.rank, 'SU', 25, 'EX', 9, 'VG', 5, 'G', 3, 'F',1) * b.tokens)
        / sum(b.tokens) ranking
From
    A
        inner join
    B
        on a.GameID = b.GameID
group by
    a.userid
于 2013-11-02T12:13:16.480 に答える