Language(R, Python, SQL)/SQL

[SQL] Codility SQL exercise 3번 문제

dtstory 2022. 11. 29. 20:00

https://app.codility.com/programmers/trainings/6/

 

Exercise 6. SQL - Practice Coding - Codility

Given a list of matches in a group stage of the soccer World Cup, compute the number of points each team currently has.

app.codility.com

Codility SQL exerercise 3번문제 풀이

 

 

<문제 출처>

 SqlWorldCup

 

SqlWorldCup coding task - Practice Coding - Codility

Given a list of matches in a group stage of the soccer World Cup, compute the number of points each team currently has.

app.codility.com

 

 

<source code>

select *
from (
    select teams.team_id, teams.team_name, coalesce(C.num_points,0) as num_points
    from teams
    left join (
        select B.team_id, sum(B.num_points) as num_points
        from (
            select A.host_team as team_id, 
                case
                    when A.host_goals > A.guest_goals then 3
                    when A.host_goals < A.guest_goals then 0
                    when A.host_goals = A.guest_goals then 1
                end as num_points
            from (
                select *
                from matches
                union all
                select match_id, guest_team as host_team, host_team as guest_team, guest_goals as host_goals, host_goals as gueset_goals
                from matches
            ) as A
        ) as B
        group by B.team_id
    ) C
    on teams.team_id = C.team_id
) D
order by D.num_points desc, D.team_id

 

해당 문제 풀이시, 주요 함수는 coalesce 이다. coalesce(변수, 0) 을 사용해, NULL인 값을 0으로 변경해주어야 한다.

풀이의 진행순서는 아래와 같다.

 

1/ host team과 guest_team은 상대적이므로, 각자 자기 입장에서의 승점(num_points) 계산이 필요하다. 따라서, match row를 각자 host_team이라고 가정하고 이어붙여 총 10개의 행을 만든다.  <union all 사용>
2/ host_team 이 이긴 경우 3점, 진 경우 0 점, 비긴 경우 1점을 부여한다. <case when 사용>
3/ 각 팀별 승점(num_points) 의 총합을 도출한다. <group by ~ sum 사용>
4/ 기존 teams 테이블에 해당 연산한 테이블(C) 를 team_id를 기준으로 join 해준다 <left join ~ on 사용>
5/ left join 을 했을 경우, key 의 value가 없는 경우 null값이 되므로, 결측치인 경우 0으로 치환해준다. <coalesce 사용>
6/ 문제의 요구 사항에 맞게 승점 및 team명을 기준으로 정렬해준다. <order by 사용>

 

해당 문제를 더 효율적으로 풀이할 수 있는 방법이 분명 있을 것이라고 생각한다. 

이 부분에 대해서는 조금 더 공부하여 다양한 풀이 전략을 익히도록 해야겠다.

728x90