✍ 월 추출하는 방법
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 <-서버별, 월별로 그룹핑
✍ 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로 그룹핑 해준 후에 조건 부여하기
✍ 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
✍ 인라인 뷰 서브쿼리는 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개 초과인 조건 부여.
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