2017-01-26 11 views
3

私は以下のように2つのテーブルusrとrsltを持っています。複数のIDとの集約/相関

enter image description here

私は以下のように出力を取得したいです。私は&これは相関クエリを使用して行うことができ

SELECT tab1.id 
     , tab1.wins 
     , tab2.loos 
FROM 
     (SELECT u1.ID 
      , COUNT(r1.WINNER) wins 
     FROM rslt r1 
      , usr u1 
     WHERE (u1.ID = r1.WINNER) 
     GROUP BY u1.ID) tab1 
     , 
     (SELECT u2.ID 
      , COUNT(r2.Looser) loos 
     FROM rslt r2 
      , usr u2 
     WHERE (u2.ID = r2.Looser) 
     GROUP BY u2.ID) tab2 
WHERE tab1.ID = tab2.id; 
+2

データベースを使用していますか? – Zeus

+0

サンプルデータがあれば、どのようにその出力に到達しましたか?多分あなたに 'RSLT'テーブルを説明して、各フィールドの意味を明確にしてください。 – Stephen

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-お問い合わせの際/ 285557#285557 –

答えて

0

を失ったusrsの多くは各として存在する場合、パフォーマンスが悪い可能性があり、合計の勝利を得るために、クエリの下にしようとしてい

enter image description here

クエリは、usrテーブルにある行ごとに実行されますが、あなたはその考えを得るべきです。

select 
     id, name, 
     (select count(*) c 
     from rslt 
     where 
     (rslt.sender = usr.id or rslt.receiver = usr.id) and 
     rslt.winner = usr.id) wins, 
     (select count(*) c 
     from rslt 
     where 
     (rslt.sender = usr.id or rslt.receiver = usr.id)) played, 
     (select count(*) c 
     from rslt 
     where 
     (rslt.sender = usr.id or rslt.receiver = usr.id) and 
     rslt.looser = usr.id) lost, 
     (select count(*) c 
     from rslt 
     where 
     (rslt.sender = usr.id or rslt.receiver = usr.id) and 
     rslt.tie <> 'T') tie 
    from usr; 

結果、私は、クエリを実行しました:以下

enter image description here

表の作成DML、いずれかが

create table usr(id number,name varchar(10)); 

create table rslt (id number,sender number, receiver number,winner number,looser number, tie varchar(1)); 

insert into usr values(1,'Prince'); 

insert into usr values(2,'Subham'); 

insert into usr values(3,'3'); 

insert into rslt values(1,1,2,2,1,'T'); 

insert into rslt values(2,2,3,3,2,'T'); 
0

をいじるしたい場合は、ここではなしにそれを行うことができる方法です複数の相関クエリを使用すると、適切に最適化するのが難しくなります。

SQL Serverで動作します
SELECT 
    u.ID 
    ,u.NAME 
    ,SUM(CASE WHEN r.SENDER = u.ID THEN 1 else 0 END + CASE WHEN r.RECEIVER = u.ID THEN 1 ELSE 0 END) as 'TotalPlayed' 
    ,SUM(CASE WHEN r.WINNER = u.ID THEN 1 ELSE 0 END) as 'TotalWins' 
    ,SUM(CASE WHEN (r.SENDER = u.ID OR r.RECEIVER = u.ID) AND r.WINNER <> u.ID THEN 1 else 0 END) as 'TotalLost' 
    ,SUM(CASE WHEN (r.SENDER = u.ID OR r.RECEIVER = u.ID) AND r.TIE <> 'T' THEN 1 else 0 END) as 'TotalTie' 
FROM USR u 
LEFT JOIN RSLT r 
ON u.ID = r.SENDER OR u.id = r.RECEIVER 
GROUP BY u.ID, u.NAME 
ORDER BY u.ID 

、私はそれは(あなたが働いているように見えるもの)Oracle用

出力OKであるべきだと思う:

id   name  TotalPlayed TotalWins TotalLost TotalTie 
----------- ---------- ----------- ----------- ----------- ----------- 
1   Prince  1   0   1   0 
2   Subham  2   1   1   0 
3   3   1   1   0   0 
4   4   0   0   0   0 
5   5   0   0   0   0 
6   6   0   0   0   0 
7   7   0   0   0   0 
8   8   0   0   0   0