본문 바로가기
SQL

[SQL, 데이터 캠프] CASE문과 데이터 캠프 예제쿼리 풀이 -1편

by 다랭킴 2020. 7. 4.

 

*Datacamp의 컨텐츠 'Intermediate SQL'의 내용을 일부만 사용하였습니다.

*저작권 문제시 댓글을 달아주시면 바로 조치를 취하겠습니다.

 

 

 

CASE문

CASE WHEN 조건1 THEN 결과1
        WHEN 조건2 THEN 결과2
        ELSE 결과3 END AS 새로운 칼럼명/필드명

*여러 가지 조건에 따른 결과를 만들고 싶을 때 사용한다.
*AS는 ALIAS때문에 들어간다.

 

*예제들을 보기 전에 알아둘 것들

matches_나라명 테이블 : 각 나라에서 진행되었던 경기들에 관한 정보.

home_team과 away_team의 경기 결과, 각 team의 id 번호 등을 담고 있다.

 

teams_나라명 테이블: 각 나라의 축구팀에 대한 정보이다.

각 팀의 id와 Full name 등의 정보를 갖고있다.

 

예제1

matches_germany는 독일에서 진행된 축구 경기들에 대한 테이블이다.

이 테이블은 home_team과 away_team의 경기 결과, 각 team의 id 번호 등을 담고 있다.

 

home_team으로 GROUP_BY를 해준 후 SELECT문을 진행한다.

 

SELECT문에 의해 결국 두 열이 남게되는데 (home_team - 1번, total matches - 2번)

1. GROUP BY로 묶었던 home_team은 CASE문의 조건들에 의해 그 내용이 달라지게 된다.

2. home_team이 GROUP BY로 엮이면서 각 home_team에 대응하는 id들의 수를 구하면

home_team이 거쳐왔던 id들, 즉 경기 수가 되기 때문에 total_matches로 지정하게 된다.

 

 

 

 

 

 

예제2

 

결과적으로 바르셀로나가 home team일 때 승자가 누군지, 상대방이 누구인지 알고 싶은 거다.

그런데 그 단계를 아래와 같이 진행한다.

1. 경기의 승자를 나타내기

2. 경기의 상대팀을 나타내기

3. 이후 home team을 Barcelona로 필터링 하기

 

쿼리가 길어지니까 이미지도 커진다

 

 위 문제에서 1, 2단계까지 진행한 쿼리이다.

일단 승리 여부를 입력하기 위해 SELECT문에서 CASE문을 썼다는 건 알겠다.

 

이제 내가 헷갈렸던 부분은 상대팀을 identify하기 위해 무엇을 했냐는 거다.

바로 awayteam_id를 기준으로 LEFT JOIN을 한 후 SELECT에서 team_long_name을 불러왔다.

away team id는 각 경기의 away team(상대 팀)을 남겨놔야 어떤 팀인지 표시할 수 있기 때문에 남겨놔야한다.

그래서 LEFT JOIN에서 away team id를 갖고있는 matches_spain테이블을 왼쪽에 둔 것이다.

다시말하면 awayteam_id에 있는 정보들은 무조건 남기고, team_api_id는 이것과 겹치는 부분만 남긴다.

 

 

 

3단계는 Barcelona가 home_team인 경우만 filter하는 쿼리를 추가한 것이다.

이전 단계의 setting에서 home_team_id의 조건만 추가한 꼴이다.

ON에서 awayteam_id = team_api_id를 설정한 건 

WHERE의 hometeam_id = 8634로 Barcelona를 필터링한 것과 아무상관이 없다.

 

 

댓글