1 minute read

문제 해결 방법 - [문제 3] 풀이

  1. [문제 3] 년도 별, 관리점 별 거래금액 합계 추출 : 출력 순서 [합계금액 desc]

해당 문제에 경우 데이터의 출력형이 json배열 안에 json배열이 있는 경우라서 쿼리를 두번 타게 설정했습니다.

가장 먼저 거래내역에서 기록이 있는 연도를 추출합니다. 1번 문제와 마찬가지로 2018년과 2019년의 거래정보밖에 없어서 하드코딩으로 두 개로 한정지어 조회 할 수도 있었으나 앞으로 계속 거래내역이 있을 수 있으므로 DB에서 따로 년도를 조회하는 로직을 추가 했습니다.

select 
	distinct year(tr_date) as year 
from 
	tbl_transaction
order by
	year asc

그 결과를 List으로 받아서 for문 조건식으로 활용하고 그 안에서 추가 조회를 합니다. 추가 조회는 dataList의 목록을 조회 합니다.v추가 조회하는 쿼리는 다음과 같습니다.

select
	b.br_name as brName,
	b.br_code as brCode,
	sum(c.sum_amt) as sumAmt
from
	tbl_account a,
	tbl_branch b,
	(
		select 
			acct_no,
			sum(tr_amount) as sum_amt
		from
			tbl_transaction
		where year(tr_date) = #{value}
		and   can_yn = 'N'
		group by
			acct_no    
	) c    
where a.acct_no = c.acct_no
and   a.br_code = b.br_code
group by
	a.br_code
order by 
	sum(c.sum_amt) desc

이렇게 조회된 데이터를 List에 저장하고 해당 데이터는 dataList의 키밸류로 Object에 저장됩니다. 조회에 활용된 JAVA소스의 일부입니다.

@Service
@Transactional
public class KakaoServiceImpl implements KakaoService {
	
	/** ...중략... **/
	
	@Override
	public List<HashMap<String, Object>> selectRankSumAmtByBrEachYear() throws Exception {
		
		List<HashMap<String, Object>> result = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> dataEachYear;
		List<HashMap<String, Object>> dataList;
		
		//각 거래 연도 그룹 조회
		List<String> eachYear = mapper.selectTransGroupYear();
		
		for(String year:eachYear) {
			//초기화
			dataEachYear = new HashMap<String, Object>();
			dataList = new ArrayList<HashMap<String,Object>>();
			
			//데이터 조회
			dataList = mapper.selectRankSumAmtByBrEachYear(year);
			
			//데이터 구성
			dataEachYear.put("year", year);
			dataEachYear.put("dataList", dataList);
			result.add(dataEachYear);
		}
		
		return result;
	}
	
	/** ...후략... **/
	
}
	

Categories:

Updated:

Comments