[Fail Log] 나의 카카오 도전기(2) - 문제 해결 방법 - [문제 1], [문제 2] 풀이
문제 해결 방법 - [문제 1], [문제 2] 풀이
- [문제 1] 년도 별 최대 합계 금액 고객 정보 추출
입력데이터 없이 년도별 합계 금액이 가장 높른 고객을 한명 출력 하는 로직입니다. 현재 데이터에서는 2018년과 2019년의 거래정보밖에 없어서 두개로 한정지어 조회 할 수도 있었으나 2020년 앞으로 계속 추가될 일자의 거래정보도 고려하였습니다. 대부분의 로직은 쿼리에 녹아져 있습니다. 우선 거래정보와 계좌정보의 테이블을 계좌번호로 조인하고 그룹핑을 거래년도와 계좌명으로 해준뒤 년도는 작은순으로 합계는 큰 순으로 정렬해 줍니다. 그리고 그 조회 쿼리를 테이블로 삼아 다시 조회 합니다. 이번에는 거래년도만 그룹핑하고 그 중에 max() 함수로 합계금액의 최대값을 가지는 열을 출력 했습니다.
select
year,
max(sum) as sumAmt,
name,
acctNo
from
(
select
year(a.tr_date) as year,
sum(a.tr_amount - a.tr_fee) as sum,
b.acct_name as name,
a.acct_no as acctNo
from
tbl_transaction a,
tbl_account b
where a.acct_no = b.acct_no
and a.can_yn = 'N'
group by
year(a.tr_date),
b.acct_name
order by
year(a.tr_date) asc,
sum(a.tr_amount - a.tr_fee) desc
) c
group by
c.year asc;
- [문제 2] 년도 별 거래가 없는 고객 정보 추출
1번 문제와 동일하게 입력데이터 없이 년도 별 거래가 없는 고객 정보 추출하는 로직입니다. 이번에도 서브쿼리를 활용했습니다. 성능을 고려 하면 NOT IN 과 같은 조선식에 부정 연산자의 사용은 지양되어야 하나 테스트를 한정하여 사용하는 거라 인덱스도 따로 설정 하지 않았기 때문에 현재 테스트에서는 NOT IN을 사용했습니다.
select
b.year,
a.acct_name as name,
a.acct_no as acctNo
from
tbl_account a,
(select distinct year(tr_date) as year from tbl_transaction) b
where
a.acct_no not in (
select
acct_no
from
tbl_transaction
where can_yn = 'N'
and year(tr_date) = b.year
group by
year(tr_date),
acct_no
)
order by
b.year asc
Comments