- ベストアンサー
SQL文で年やleague_idごとの順位表を作成する方法
- データベース内のデータを年やleague_idごとに分類し、順位表を作成するには、SQL文を使用します。
- まず、teamテーブルとtaisenテーブルを作成します。
- teamテーブルにはチームの情報を、taisenテーブルには試合結果を格納します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>まだ試合をおこなっていないチームもランク付けしたいのですが、 ではまず、teamテーブルの、2012年1リーグEチームを登録します insert into team values(13,'E',2012,1); //v1を作り直します。(すでにある場合は削除してください) create view v1 as select id,hometeam as team_id ,case when homepoint>awaypoint then 3 when homepoint = awaypoint then 1 else 0 end as wp ,if(homepoint>awaypoint,1,0) as w ,if(homepoint=awaypoint,1,0) as d ,if(homepoint<awaypoint,1,0) as l ,homepoint as tokuten ,awaypoint as sitten ,team_name,year ,leagueid from taisen inner join team on team.team_id=hometeam union all select id,awayteam as team_id ,case when homepoint<awaypoint then 3 when homepoint = awaypoint then 1 else 0 end ,if(homepoint<awaypoint,1,0) ,if(homepoint=awaypoint,1,0) ,if(homepoint>awaypoint,1,0) ,awaypoint ,homepoint ,team_name,year ,leagueid from taisen inner join team on team.team_id=awayteam union all select null,team_id,0,0,0,0,0,0,team_name,year,leagueid from team left join taisen on taisen.hometeam=team.team_id or taisen.awayteam=team.team_id where taisen.id is null //v2を少しいじります。(すでにあるものは削除) create view v2 as select team_id,year,leagueid,team_name ,sum(wp) as wp ,count(id) as count ,sum(w) as w ,sum(d) as d ,sum(l) as l ,sum(tokuten) as tokuten ,sum(sitten) as sitten ,sum(tokuten) - sum(sitten) as tokusitten from v1 group by team_id,year,leagueid; //この状態で、前回のSQLを走らせます select year,leagueid, (select count(*)+1 from v2 as v2b where 1 and v2a.year=v2b.year and v2a.leagueid=v2b.leagueid and (0 or v2a.wp<v2b.wp or v2a.wp=v2b.wp and v2a.w<v2b.w or v2a.wp=v2b.wp and v2a.w=v2b.w and v2a.tokuten<v2b.tokuten or v2a.wp=v2b.wp and v2a.w=v2b.w and v2a.tokuten=v2b.tokuten and v2a.tokusitten<v2b.tokusitten ) ) as rank,team_id,team_name ,wp,count,w,d,l,tokuten,sitten,tokusitten from v2 as v2a order by year,leagueid,rank; ※2012年1リーグの5位にチームEが表示されます
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
あら、まだこの課題でつまってましたか・・・ 面倒なのでviewを使って処理してみました。 もとのデータの持ち方が非効率なのでこのくらいが限界かなと。 //ホームチーム、アウェイチーム関係なくとりあえずビューにまとめる create view v1 as select id,hometeam as team_id ,case when homepoint>awaypoint then 3 when homepoint = awaypoint then 1 else 0 end as wp ,if(homepoint>awaypoint,1,0) as w ,if(homepoint=awaypoint,1,0) as d ,if(homepoint<awaypoint,1,0) as l ,homepoint as tokuten ,awaypoint as sitten ,team_name,year ,leagueid from taisen inner join team on team.team_id=hometeam union all select id,awayteam as team_id ,case when homepoint<awaypoint then 3 when homepoint = awaypoint then 1 else 0 end ,if(homepoint<awaypoint,1,0) ,if(homepoint=awaypoint,1,0) ,if(homepoint>awaypoint,1,0) ,awaypoint ,homepoint ,team_name,year ,leagueid from taisen inner join team on team.team_id=awayteam; //ビュー1から集計したビュー2を作成 create view v2 as select team_id,year,leagueid,team_name ,sum(wp) as wp ,count(*) as count ,sum(w) as w ,sum(d) as d ,sum(l) as l ,sum(tokuten) as tokuten ,sum(sitten) as sitten ,sum(tokuten) - sum(sitten) as tokusitten from v1 group by team_id,year,leagueid; ※ここまでビューは一回作ってしまえば2回目からは作成する必要はありません //順位つき勝敗表 select year,leagueid, (select count(*)+1 from v2 as v2b where 1 and v2a.year=v2b.year and v2a.leagueid=v2b.leagueid and (0 or v2a.wp<v2b.wp or v2a.wp=v2b.wp and v2a.w<v2b.w or v2a.wp=v2b.wp and v2a.w=v2b.w and v2a.tokuten<v2b.tokuten or v2a.wp=v2b.wp and v2a.w=v2b.w and v2a.tokuten=v2b.tokuten and v2a.tokusitten<v2b.tokusitten ) ) as rank,team_id,team_name ,wp,count,w,d,l,tokuten,sitten,tokusitten from v2 as v2a order by year,leagueid,rank; ※ランクの根拠は「勝ち点順>勝ち数順>得点順>得失点順」にしてあります。 当該個所を修正すればランクの調整ができると思います。 ※今回の例だと2011年のリーグ2はID=9のAチームとID=10のBチームは 勝ち点、勝ち数、得点、得失点ともにおなじなので同じ順位になります。
お礼
yambejp 様 有難う御座います。 まだ解決しておらず、放置状態のままでした・・ とても助かりました。 本当に有難う御座います。 再度ご質問なのですが、 上記の場合、試合をおこなったチームの場合対象になっておりますが、 まだ試合をおこなっていないチームもランク付けしたいのですが、 どのようにしたらよろしいでしょうか? 度重なる質問で大変申し訳御座いませんが、宜しくお願いいたします。
お礼
yambejp 様 度重なる質問に対し、ご回答有難う御座います。 できました!! 本当に有難う御座います。 本当に助かりました。 次は総当り表を実装予定ですが、またわからないことがありましたらご教授お願いできればと思います。 本当に有難うございました。