[TIL] SQL 3회차 세션 문제풀이

Jeong Min·2025년 5월 20일
  1. 조건1) 서버별, 월별 게임계정id 수를 중복값 없이 추출해주세요. 월은 첫 접속일자를 기준으로 계산해주세요. 월은 yyyy-mm의 형태로 추출해주세요.

✍ 월 추출하는 방법
1. SUBSTR(컬럼,시작,~까지) - 시작 위치부터 원하는 위치까지 추출하기
2. LEFT(컬럼,~까지) - 왼쪽에서 바로 추출하는 함수.

문제 풀이.
SELECT serverno,
SUBSTR(first_login_date,1,7) AS m, <- 기간을 월까지만 추출
COUNT(distinct game_account_id) AS <- 중복을 제외하기 위해 DISTINCT
FROM marketer_sql_users msu
GROUP BY serverno, m <-서버별, 월별로 그룹핑

  1. 조건1) group by 를 활용하여 첫 접속일자별 게임캐릭터수를 중복값 없이 구하고,
    조건2) having 절을 사용하여 그 값이 10개를 초과하는 경우의 첫 접속일자 및 게임캐릭터id 개수를 추출해주세요.

✍ HAVING은 WHERE절과 비슷한 용도. 하지만 그룹핑 해준 것에서 조건을 주기 때문에 집계함수의 조건을 걸 수 있다는 차이점.

문제 풀이.
SELECT first_login_date,
COUNT(DISTINCT game_actor_id) AS actor_cnt <- 중복값 제외 DISTINCT
FROM marketer_sql_users msu
GROUP BY first_login_date
HAVING actor_cnt > 10 <- GROUP BY로 그룹핑 해준 후에 조건 부여하기

  1. 조건1) group by 절을 사용하여 서버별, 유저구분(기존/신규) 게임캐릭터id수를 구해주세요. 중복값을 허용하지 않는 고유한 갯수로 추출해주세요.
    조건2) 기존/신규 기준→ 첫 접속일자가 2024-01-01 보다 작으면(미만) 기존유저, 그렇지 않은 경우 신규유저
    조건3) 또한, 서버별 평균레벨을 함께 추출해주세요.

✍ IF(컬럼 조건, 참일 때의 값, 거짓 일 때의 값)

문제 풀이.
SELECT serverno,
IF(first_login_date < '2024-01-01', '기존유저', '신규유저') AS gb,
COUNT(DISTINCT game_actor_id) AS actor_cnt,
AVG(level) AS avg_level
FROM marketer_sql_users msu
GROUP BY serverno, gb

  1. 조건1) 문제2번을 having 이 아닌 인라인 뷰 서브쿼리를 사용하여 추출해주세요.

✍ 인라인 뷰 서브쿼리는 FROM절 뒤에서 하나의 테이블 역할을 함.

문제 풀이.
SELECT a.first_login_date,
a.actor_cnt
FROM
( <- 서브쿼리 시작
SELECT first_login_date, <- 메인 쿼리에서 뽑아주기 위해서 셀렉트
COUNT(DISTINCT game_actor_id) AS actor_cnt <- 중복을 제외한 계정
FROM marketer_sql_users
GROUP BY first_login_date <- 그룹핑 해주고 HAVING절은 제외. 메인쿼리에서 WHERE절 사용
) AS a <- 서브쿼리 끝
WHERE a.actor_cnt > 10 <- 서브쿼리의 계정 갯수가 10개 초과인 조건 부여.

  1. 조건1) 레벨이 30 이상인 캐릭터를 기준으로, 게임계정 별 캐릭터 수를 중복값 없이 추출해주세요.
    조건2) having 구문을 사용하여 캐릭터 수가 2 이상인 게임계정만 추출해주세요.
    조건3) 인라인 뷰 서브쿼리를 활용하여 캐릭터 수 별 게임계정 개수를 중복값 없이 추출해주세요.

SELECT a.actor_cnt,
COUNT(game_account_id) AS accnt
FROM
(
SELECT COUNT(game_actor_id) AS actor_cnt, <- 메인쿼리에 필요한 것.
game_account_id <-그룹핑에 필요한 것.
FROM marketer_sql_users msu
WHERE level >= 30 <- WHERE절로 먼저 행의 조건 부여
GROUP BY game_account_id
HAVING actor_cnt >= 2 <- 그룹핑 후 그룹의 조건 부여
) AS a
GROUP BY a.actor_cnt <- 메인쿼리에서 그룹을 지어줌.
ORDER BY a.actor_cnt

0개의 댓글