본문 바로가기

학습/SQL

[solvesql] SQL 풀어보기 - 멀티 플랫폼 게임 찾기

✔️ 문제

데이터베이스를 조회해 2012년 이후 출시된 게임들 중 둘 이상의 메이저 플랫폼 계열에 출시된 게임 이름을 출력하는 쿼리를 작성해주세요. 쿼리 결과에는 아래 컬럼만 포함되어 있어야 하고, 중복된 게임은 1번만 출력되어야 합니다.

  • Sony: 'PS3', 'PS4', 'PSP', 'PSV'
  • Nintendo: 'Wii', 'WiiU', 'DS', '3DS'
  • Microsoft: 'X360', 'XONE'

✔️ LEVEL 3

 

📌 주요 요구사항

  1. 메이저 플랫폼 계열 구분
  2. 2012년 이후 출시된 게임만 조회
  3. 둘 이상의 메이저 플랫폼 계열에 출시된 게임만 출력
  4. 게임 이름 중복 제외
with m as (select g.name game_name, year, p.platform_id , p.name,
case when p.name in ('PS3', 'PS4', 'PSP', 'PSV') then 'sony'
  when p.name in ( 'Wii', 'WiiU', 'DS', '3DS') then 'Nintendo'
  when p.name in ('X360', 'XONE') then 'Microsoft' 
  else 'etc' end as platform
from games g left join platforms p on g.platform_id=p.platform_id
where year >= 2012 and platform in ('sony','Nintendo','Microsoft') 
)

select DISTINCT game_name name
from m
group by game_name
having count(DISTINCT platform) >= 2

✍ 코드 해석

1. WITH m AS (...) 서브쿼리

  • games 테이블과 platforms 테이블을 LEFT JOIN하여 platform_id를 기준으로 게임과 플랫폼 조인
  • CASE WHEN 문을 사용하여 각 플랫폼을 Sony, Nintendo, Microsoft로 나누어 새로운 컬럼 생성
  • WHERE 절을 통해 2012년 이후 출시된 게임, 메이저 플랫폼(Sony, Nintendo, Microsoft)에 해당하는 게임 필터링

2. 최종 데이터 필터링

  • GROUP BY game_name을 사용하여 게임별로 그룹화
  • HAVING COUNT(DISTINCT platform) >= 2 조건을 추가하여 두 개 이상의 메이저 플랫폼에서 출시된 게임만 필터링
  • DISTINCT game_name을 적용하여 중복 제거 후 게임 이름 출력

 

📌 실행 결과

총 298개의 데이터가 출력되었다.

 

📌 정리

  • 불필요한 플랫폼 데이터 제거: CASE WHEN 문을 통해 메이저 플랫폼만 남김
  • 정확한 데이터 필터링: 2012년 이후 출시된 게임만 조회
  • 중복 제거 및 그룹화: DISTINCT, GROUP BY, HAVING을 활용하여 중복된 게임 이름을 제거하고, 둘 이상의 메이저 플랫폼에 출시된 게임만 조회