Q. 2000년 이후의 메달 수상 기록만 고려했을 때, 메달을 수상한 올림픽 참가 선수 중 2개 이상의 국적으로 메달을 수상한 기록이 있는 선수의 이름을 조회하는 쿼리를 작성해주세요. 조회된 선수의 이름은 오름차순으로 정렬되어 있어야 합니다.
- 문제 조건 확인
1. 2000년 이후의 올림픽 게임 기록만 사용
→ where year >= 2000
2. 메달을 수상한 올림픽 참가 선수의 국적이 2개 이상
→ where medal not null 사용 및 group by + count(distinct ~ ) 문 필요 예상
3. 조회된 선수의 이름은 오름차순 정렬
→ order by name
- 테이블 확인
- 풀이과정
1. records 테이블과 games 테이블을 조인, where 절 조건 추가
select athlete_id, team_id
from records
inner join
(select id, year
from games) as g
on records.game_id = g.id
where medal not null and year >= 2000
limit 1000
;
2. group by와 count(distinct ~ )로 선수별 국적 수 확인
select athlete_id, count(distinct team_id) cnt
from records
inner join
(select id, year
from games) as g
on records.game_id = g.id
where medal not null and year >= 2000
group by athlete_id
limit 1000
;
3. having 조건 추가, athletes 테이블 조인
select name, count(distinct team_id) cnt
from records
inner join
(select id, year
from games) as g
on records.game_id = g.id
inner join
(select *
from athletes) as a
on records.athlete_id = a.id
where year >= 2000 and medal not null
group by athlete_id
having cnt > 1
;
A. 최종 답안
select name
from records
inner join
(select id, year
from games) as g
on records.game_id = g.id
inner join
(select *
from athletes) as a
on records.athlete_id = a.id
where year >= 2000 and medal not null
group by athlete_id
having count(distinct team_id) > 1
order by name
;
'[SQL] 연습' 카테고리의 다른 글
[solvesql] 지역별 주문의 특징 (0) | 2022.10.20 |
---|---|
[solvesql] 일별 블로그 방문자 수 집계 (0) | 2022.10.13 |
[SQL] 쇼핑몰의 일일 매출액과 ARPPU (0) | 2022.07.24 |
[mysql] 프로그래머스 우유와 요거트가 담긴 장바구니 (0) | 2022.07.22 |
[mysql] 프로그래머스 보호소에서 중성화한 동물 (0) | 2022.07.17 |