조건1) 서버별, 월별 게임계정id 수를 중복값 없이 추출해주세요. 월은 첫 접속일자를 기준으로 계산해주세요. 월은 yyyy-mm의 형태로 추출해주세요.
힌트: 월을 추출하는 방법→날짜는 string(문자열) 형식으로 저장되어 있으므로, 문자열을 자르는 함수를 사용해주시면 좋겠죠? 😃

문제 풀이
내 풀이 : 정답 o
select serverno,
DATE_FORMAT(first_login_date, '%Y-%m') AS MONTH,
count(distinct game_account_id) AS cnt_acc
from marketer_sql_users
group by serverno, DATE_FORMAT(first_login_date, '%Y-%m');
이유는 월별로나누고 거기서 다시 서버별로 나누기때문에
조건1) group by 를 활용하여 첫 접속일자별 게임캐릭터수를 중복값 없이 구하고,
조건2) having 절을 사용하여 그 값이 10개를 초과하는 경우의 첫 접속일자 및 게임캐릭터id 개수를 추출해주세요.

내 정답 및 문제풀이
select first_login_date,
count(DISTINCT game_actor_id) as cnt_actor
from marketer_sql_users
group by first_login_date
having cnt_actor >10;
#조건1) group by 절을 사용하여 서버별, 유저구분(기존/신규) 게임캐릭터id수를 구해주세요. 중복값을 허용하지 않는 고유한 갯수로 추출해주세요.
#조건2) 기존/신규 기준→ 첫 접속일자가 2024-01-01 보다 작으면(미만) 기존유저, 그렇지 않은 경우 신규유저
#조건3) 또한, 서버별 평균레벨을 함께 추출해주세요.

정답 !
select serverno,
CASE
WHEN first_login_date < '2024-01-01' THEN '기존유저'
WHEN first_login_date >='2024-01-01' THEN '신규유저'
end as gb,
count(DISTINCT game_actor_id) as actor_cnt,
avg(level) as avg_level
from marketer_sql_users
group by serverno,gb;
🔥**문제4 - SubQuery의 활용**#조건1) 문제2번을 having 이 아닌 인라인 뷰 서브쿼리를 사용하여 추출해주세요.
#힌트: 인라인 뷰 서브쿼리는 from 절 뒤에 위치하여, 마치 하나의 테이블 같은 역할을 했었습니다!

select *
from(
select first_login_date,
count(distinct game_actor_id) as actor_cnt
from marketer_sql_users
group by first_login_date
) as sub_quary
where actor_cnt > 10
;
서브쿼리문을 원래대로 작성하다가
마지막에 인라인 서브쿼리만
1. select *
from(
서브쿼리
) as 별칭 꼭 붙여주기
where로 호출하기
;
끝
#조건1) 레벨이 30 이상인 캐릭터를 기준으로, 게임계정 별 캐릭터 수를 중복값 없이 추출해주세요.
#조건2) having 구문을 사용하여 캐릭터 수가 2 이상인 게임계정만 추출해주세요.
#조건3) 인라인 뷰 서브쿼리를 활용하여 캐릭터 수 별 게임계정 개수를 중복값 없이 추출해주세요.

1번
select game_account_id,
count(DISTINCT game_actor_id)
from marketer_sql_users
where level>=30
2번
select count(DISTINCT game_actor_id),
game_account_id
from marketer_sql_users
where level>=30
group by game_account_id
having count(DISTINCT game_actor_id)>=2
3번 인라인 쿼리만들기
select a.actor_cnt, count(accnt)
from (
select count(DISTINCT game_actor_id) as actor_cnt ,
game_account_id as accnt
from marketer_sql_users msu
where level>=30
group by game_account_id
having count(DISTINCT game_actor_id) >=2
) as a
group by a.actor_cnt;