https://solvesql.com/problems/predict-game-scores-1/
-- 'games' 테이블에서 각 장르별 평균 평점 및 평론/사용자 수를 계산하고, 이를 기준으로
-- 특정 평론/사용자 정보가 NULL인 게임들에 대해 대체값을 채워주는 쿼리
WITH B AS (
-- 'games' 테이블에서 각 'genre_id' 별로 평론 점수, 평론 수, 사용자 점수, 사용자 수의 평균을 계산
SELECT
genre_id, -- 장르 ID
round(AVG(critic_score), 3) AS avg_cs, -- 각 장르의 평균 평론 점수를 소수점 3자리까지 반올림
ceil(AVG(critic_count)) AS avg_cc, -- 각 장르의 평균 평론 수를 올림
round(AVG(user_score), 3) AS avg_us, -- 각 장르의 평균 사용자 점수를 소수점 3자리까지 반올림
ceil(AVG(user_count)) AS avg_uc -- 각 장르의 평균 사용자 수를 올림
FROM games
GROUP BY genre_id -- 장르 ID별로 그룹화하여 평균 계산
)
-- 'games' 테이블과 위에서 계산한 평균 값을 가진 B 테이블을 조인하여 NULL 값을 채워넣기
SELECT
game_id, -- 게임 ID
name, -- 게임 이름
-- critic_score가 NULL인 경우 B 테이블의 avg_cs로 대체
CASE
WHEN critic_score IS NULL THEN B.avg_cs
ELSE critic_score
END AS critic_score, -- 평론 점수
-- critic_count가 NULL인 경우 B 테이블의 avg_cc로 대체
CASE
WHEN critic_count IS NULL THEN B.avg_cc
ELSE critic_count
END AS critic_count, -- 평론 수
-- user_score가 NULL인 경우 B 테이블의 avg_us로 대체
CASE
WHEN user_score IS NULL THEN B.avg_us
ELSE user_score
END AS user_score, -- 사용자 점수
-- user_count가 NULL인 경우 B 테이블의 avg_uc로 대체
CASE
WHEN user_count IS NULL THEN B.avg_uc
ELSE user_count
END AS user_count -- 사용자 수
FROM
games AS A -- 'games' 테이블을 A로 alias 설정
JOIN B -- B 테이블과 A를 genre_id를 기준으로 조인
ON A.genre_id = B.genre_id
WHERE
-- 'critic_score', 'critic_count', 'user_score', 'user_count' 중 하나라도 NULL인 경우에만 결과를 반환
(A.critic_score IS NULL OR
A.critic_count IS NULL OR
A.user_score IS NULL OR
A.user_count IS NULL)
AND year >= 2015 -- 2015년 이후에 출시된 게임만 결과에 포함
'SQL' 카테고리의 다른 글
[solvesql - day 11] 서울숲 요일별 대기오염도 계산하기 (1) | 2025.01.11 |
---|---|
[solvesql - day 10] 최대값을 가진 행 찾기 (0) | 2025.01.10 |
[solvesql - day 8] 온라인 쇼핑몰의 월 별 매출액 집계 (0) | 2025.01.10 |
[solvesql - day 7] 기증품 비율 계산하기 (0) | 2025.01.10 |
[solvesql - day 6] 게임을 10개 이상 발매한 퍼블리셔 찾기 (0) | 2025.01.10 |