회원 월별 분기별 년도별 통계 쿼리
오늘은 회원별 통계 쿼리를 알아보도록 하겠습니다
mybatis를 활용해서 여러 조건문을 한번에 처리하는 쿼리를 작성하도록 하겠습니다
selectType을 프론트 단에서 month, quarter, recentYear의 값들을 받아옵니다
그리고 회원 테이블인 MB_MST에서 등록일자와 회원구분에 대한 값을 서브쿼리로 작성합니다
회원 구분별로 GROUP BY ROLLUP을 하여 진행한다는 것이 핵심입니다
GROUP BY ROLLUP 밑에 포스팅도 걸어 놓았습니다
2020.03.08 - [IT_Web/Oracle] - Oracle ROLLUP, CUBE, GROUPING(), GROUPING SETS(), GROUP_ID() 함수 개념
Oracle ROLLUP, CUBE, GROUPING(), GROUPING SETS(), GROUP_ID() 함수 개념
ROLLUP ROLLUP은 SELECT한 컬럼들을 GROUP BY 절과 함께 사용하게 되면 소계를 구할 수 있다 그 과정에는 CARTESIAN PRODUCT를 이용한 결과물들이란 것을 알아두자 또 한 ROLLUP의 인수는 계층 구조이므로 인수
tantangerine.tistory.com
그럼 실제 코드 사례를 한번 보도록 하겠습니다
자세히 보시면 등록일로 하여 컨트롤 하는 것을 보실 수 있습니다
<select id="selectNewMemberDetail" parameterType="Map" resultType="Map">
SELECT
/* DECODE를 활용해서 회원구분별로 누적 합계를 추출한다 */
decode(CD_ID, '0010', 'normalSum', '0020', 'individualSum', '0030', 'organizationSum', '0040', 'affilicorpSum','membertypeSum') as memberType
<choose>
<when test="selectType == 'month'"> /* DECODE 함수를 활용해서 월별로 필드를 추출한다 */
, count(decode(to_char(reg_dt, 'MM'),'01',0)) "M01"
, count(decode(to_char(reg_dt, 'MM'),'02',0)) "M02"
, count(decode(to_char(reg_dt, 'MM'),'03',0)) "M03"
, count(decode(to_char(reg_dt, 'MM'),'04',0)) "M04"
, count(decode(to_char(reg_dt, 'MM'),'05',0)) "M05"
, count(decode(to_char(reg_dt, 'MM'),'06',0)) "M06"
, count(decode(to_char(reg_dt, 'MM'),'07',0)) "M07"
, count(decode(to_char(reg_dt, 'MM'),'08',0)) "M08"
, count(decode(to_char(reg_dt, 'MM'),'09',0)) "M09"
, count(decode(to_char(reg_dt, 'MM'),'10',0)) "M10"
, count(decode(to_char(reg_dt, 'MM'),'11',0)) "M11"
, count(decode(to_char(reg_dt, 'MM'),'12',0)) "M12"
</when>
<when test="selectType == 'quarter'"> /* DECODE 함수를 활용해서 분기별로 필드를 추출한다 */
, count(decode(to_char(reg_dt, 'MM'),'01',0)) + count(decode(to_char(reg_dt, 'MM'),'02',0)) + count(decode(to_char(reg_dt, 'MM'),'03',0)) "Q1"
, count(decode(to_char(reg_dt, 'MM'),'04',0)) + count(decode(to_char(reg_dt, 'MM'),'05',0)) + count(decode(to_char(reg_dt, 'MM'),'06',0)) "Q2"
, count(decode(to_char(reg_dt, 'MM'),'07',0)) + count(decode(to_char(reg_dt, 'MM'),'08',0)) + count(decode(to_char(reg_dt, 'MM'),'09',0)) "Q3"
, count(decode(to_char(reg_dt, 'MM'),'10',0)) + count(decode(to_char(reg_dt, 'MM'),'11',0)) + count(decode(to_char(reg_dt, 'MM'),'12',0)) "Q4"
</when>
<when test="selectType == 'recentYear'"> /* DECODE 함수를 활용해서 년별로 필드를 추출한다 */
, count(decode(to_char(reg_dt, 'YYYY'),to_char(to_char(sysdate,'YYYY')-3),0)) "currentYear03"
, count(decode(to_char(reg_dt, 'YYYY'),to_char(to_char(sysdate,'YYYY')-2),0)) "currentYear02"
, count(decode(to_char(reg_dt, 'YYYY'),to_char(to_char(sysdate,'YYYY')-1),0)) "currentYear01"
, count(decode(to_char(reg_dt, 'YYYY'),to_char(sysdate,'YYYY'),0)) "currentYear"
</when>
</choose>
/* DECODE 함수를 활용해서 전체합계 추출한다 */
, count(mb_tpcd) total
FROM
(
SELECT
reg_dt,
MB_TPCD
FROM MB_MST
WHERE SUBSTR(reg_dt,1,4) = #{selectYear}
) MBM
GROUP BY ROLLUP(MB_TPCD) /* 합계 및 소계를 나타낼수 있는 함수 */
</select>
이렇게 회원 월별 분기별 년도별을 알아보았습니다
조금은 어려울 수 있지만
작은 쿼리를 만들어서 테이블을 생성해서 하나씩 만들어보는 것도 좋을 듯합니다
그럼 오늘도 공부 열심히 하시고!
다음 포스팅도 많은 기대부탁드립니다~
'IT_Web > Oracle' 카테고리의 다른 글
oracle 상품 판매 통계 쿼리 union all case group by 활용 (0) | 2022.08.10 |
---|---|
oracle 회원 가입 증가현황 DECODE 통계 쿼리 CASE, GROUP BY 활용 (0) | 2022.08.09 |
오라클 트리구조 완벽 이해하기 oracle start with connect by 사용법 (0) | 2022.07.13 |
오라클 한번에 여러 테이블 데이터 삽입, oracle INSERT ALL하기 (0) | 2022.07.11 |
Oracle - 카티시안(Cartesian) 곱을 이용한 조인 - 고정된 양식 출력 (0) | 2020.05.28 |