LeetCode-1212。クエリのチームは(中等度)スコア

表:チーム

+ ---------- + --------------- +
|カラム名|タイプ|
+ --------------- + ---------- +
| TEAM_ID | int型|
| TEAM_NAME | VARCHAR |
+ --------------- + ---------- +
このテーブルの主キーは、テーブル内の各行は独立したサッカーチームを表し、TEAM_IDあります。
表:マッチ

+ --------- + --------------- +
|カラム名|タイプ|
+ --------------- + + ---------
| match_id | int型|
| host_team | int型|
| guest_team | int型| 
| host_goals | int型|
| guest_goals | int型|
+ -------------- - + --------- +
このテーブルの主キーは、テーブルの各行は、によって終了したゲーム、訪問者が自分のIDで表されたメインゲーム、彼らの目標を表し、match_idれますそれぞれhost_goalsとguest_goals。
 

次のようにポイント規則は、次のとおりです。

私たちは、三分の一を獲得する必要があり、
フラットな1点だった。
ノーポイントを失いました。
各チームTEAM_ID、TEAM_NAMEとなる。num_pointsを照会するためにSQL文を書きます。二つのチームが同じ点を持っている場合となる。num_pointsに従って降順の結果は、2つのチームが昇順にソートTEAM_ID。

次の形式でクエリ結果:

チーム表:
+ ----------- + -------------- +
| TEAM_ID | TEAM_NAME |
+ ----------- + -------------- +
| 10 | Leetcode FC |
| 20 | アメリカニューヨークFC |
| 30 | アトランタFC |
| 40 | シカゴFC |
| 50 | トロントFC |
+ ----------- + -------------- +

マッチテーブル:
+ ------------ + ------------ + --------------- + - ----------- + -------------- +
| match_id | host_team | guest_team | host_goals | guest_goals |
+ ------------ + ------------ + --------------- + ----- -------- + -------------- +
| 1 | 10 | 20 | 3 | 0 |
| 2 | 30 | 10 | 2 | 2 |
| 3 | 10 | 50 | 5 | 1 |
| 4 | 20 | 30 | 1 | 0 |
| 5 | 50 | 30 | 1 | 0 |
+ ------------ + ------------ + --------------- + ----- -------- + -------------- +

結果テーブル:
+ ------------ + ------------ + --------------- +
| TEAM_ID | TEAM_NAME | なる。num_points |
+ ------------ + ------------ + --------------- +
| 10 | Leetcode FC | 7 |
| 20 | アメリカニューヨークFC | 3 |
| 50 | トロントFC | 3 |
| 30 | アトランタFC | 1 |
| 40 | シカゴFC | 0 |
+ ------------ + ------------ + --------------- +

出典:滞在ボタン(LeetCode)
//leetcode-cn.com/problems/team-scores-in-football-tournament:リンク:httpsの
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。

モデレーション:各チームTEAM_ID、TEAM_NAMEとなる。num_pointsを照会するためにSQL文を記述します。二つのチームが同じ点を持っている場合となる。num_pointsに従って降順の結果は、2つのチームが昇順にソートTEAM_ID。

目標は、スコアは、最終的に合計が計算されます。

考察:まず、チームの統合を訪問ゲームホームチームを計算し、データ処理の結果に基づいて、その後、すべてのチームとスコアIDを見つけます。

問題解決:

方法の一つ:アイデア:ID、チーム名、スコアを求めています。

まず、労働組合によってすべての競技テーブルの結果が、結果は一緒に、2つのチームになります。5試合、10チームの同等は、テーブルゲームの左右を入れ替える場合は、5つの試合が含まれている10チームの結果かもしれません。

次いで、左から右へ、左確か以上のテーブルのチームに参加し、条件に戻って、パケットの各行の右側を積分、総和を比較することによって決定されると、比較することによって決定されます。

最後に、あなたは状況に応じて並べ替えることができます。

select t.team_id,t.team_name,
sum(case when m.host_goals > m.guest_goals then 3 
      when m.host_goals = m.guest_goals then 1
      else 0 end) num_points
from teams t 
left join
(select host_team, guest_team, host_goals, guest_goals
from matches
union all
select guest_team host_team, host_team guest_team, guest_goals host_goals, host_goals guest_goals
from matches) m
on m.host_team = t.team_id
group by t.team_id
order by num_points desc, t.team_id asc

-- 练习
-- left join 
-- LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹-- -- 配,则结果为 NULL。

select t.team_id, t.team_name,
sum(case when m.host_goals>m.guest_goals then 3 when m.host_goals = m.guest_goals then 1 else 0 end) num_points from teams t left join
(select host_team, guest_team, host_goals, guest_goals
from matches
union all
select guest_team host_team, host_team guest_team, guest_goals host_goals, host_goals guest_goals
from matches) m
on m.host_team = t.team_id
group by t.team_id
order by num_points desc,t.team_id asc;




方法2:

select t.team_id,t.team_name,sum(
    CASE WHEN t.team_id= m.host_team and m.host_goals>m.guest_goals THEN 3
         WHEN m.host_goals = m.guest_goals THEN 1
         WHEN t.team_id = m.guest_team and m.guest_goals>m.host_goals THEN 3 ELSE 0 END
    ) as num_points 
from Teams t 
left join Matches m 
on t.team_id=m.host_team or t.team_id=m.guest_team 
group by t.team_id 
order by num_points desc ,team_id asc

知識ポイント:

UNIONは別の値を選択します。使用UNION ALL重複する値を選択します!

公開された144元の記事 ウォンの賞賛2 ビュー5745

おすすめ

転載: blog.csdn.net/Hello_JavaScript/article/details/104712880