*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를 필터링한 것과 아무상관이 없다.
'SQL' 카테고리의 다른 글
[Bigquery, 고객센터 예제] 7월 브라우저별 발생한 총 거래 건 수 (0) | 2020.11.21 |
---|---|
[Bigquery, 고객센터 예제] _TABLE_SUFFIX 날짜 단위로 나뉜 테이블을 모두 불러오기, DATE_SUB으로 지난 날짜 구하기 (0) | 2020.11.20 |
[SQL, 데이터캠프] 서브쿼리 오답노트 2편 (0) | 2020.06.27 |
[SQL, 데이터캠프] 서브쿼리 오답노트 1편 (0) | 2020.06.27 |
[SQL] 오랫만에 SQL을 봤을 때 보면 좋을 것들 (0) | 2020.06.27 |
댓글