2017-03-23 4 views
2

私のジレンマは、チェスのゲームでユーザーの合計スコアを把握しようとしています。その特定のユーザは、白いユーザまたは黒いユーザとしてプレーすることができる。コードは次のとおりです:PL/SQLでユーザースコアを取得

create table user(
u_id int, 
u_name varchar(50), 
u_grade int, 
u_rating int, 
primary key (u_id)); 

create table competition(
c_id int, 
c_name varchar(255), 
c_date date, 
primary key (c_id)); 

create table matchup(
b_id int, 
c_id int, 
turn int, 
x_pid int, 
y_pid int, 
x_score number, 
y_score number, 
primary key(b_id,c_id,turn), 
foreign key(c_id) references competition, 
foreign key(x_pid) references user, 
foreign key(y_pid) references user); 

insert into matchup values(1,1,1,1,2,0,1); 
insert into matchup values(2,1,1,3,4,0.5,0.5); 
insert into matchup values(11,1,1,5,6,1,0); 
insert into matchup values(12,1,1,7,8,0,1); 
insert into matchup values(1,1,2,2,3,0,1); 
insert into matchup values(2,1,2,4,1,1,0); 
insert into matchup values(11,1,2,8,5,1,0); 
insert into matchup values(12,1,2,6,7,0.5,0.5); 

私たちの目的のために、1はBobのu_idです。彼がy_pidとしてプレーしたときに彼がx_pid +としてプレーしたときに得た得点に基づいてボブの合計得点を計算するにはどうすればよいですか?ここに私がこれまでに持っていたことがあります。

CURSOR c1 IS SELECT (SUM(x_score) + SUM(y_score)) AS total_score FROM matchup JOIN user u1 ON matchup.y_pid = u1.u_id 
JOIN user u2 ON matchup.x_pid = u2.u_id JOIN competition ON matchup.c_id = competition.c_id WHERE 
(u1.u_name = 'Bob' OR u2.u_name = 'Bob') AND commpetition.c_name = 'Wonderland'; 

このクエリは、私が試したすべてのユーザー、つまり2番目のユーザーに同じ出力を与えているようです。何が間違っているのですか?ボブにとっては、彼が何のゲームにも勝たなかったので合計得点は0になるはずです(0得点は無勝利です、0.5は引き分け得点、1は勝利点です)

答えて

1

あなたのお問い合わせは簡略化された形式:

select (sum(x_score) + sum(y_score)) as total_score 
    from matchup 
where x_pid = 1 
    or y_pid = 1; 

これは、相手のボブの得点と得点の合計を計算します。だからあなたはあるものを別のものから分離する必要があります。

例1:

select (sum(decode(x_pid, 1, x_score, 0)) + sum(decode(y_pid, 1, y_score, 0))) as total_score 
    from matchup 
where x_pid = 1 
    or y_pid = 1; 

例2:

select sum(s) as total_score 
    from (select sum(x_score) s 
      from matchup 
     where x_pid = 1 
     union all 
     select sum(y_score) 
      from matchup 
     where y_pid = 1); 
+0

ねえコンスタンチンは、説明と私のクエリを削減していただきありがとうございます。正しい答えを選んでください。あなたも同様に気にしないなら、私の質問をupvoteしてください:) –

関連する問題