1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | WITH TBDWMERSMBMORCD AS ( SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-1), 'YYYYMM' ) ACPT_YM, 20 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-2), 'YYYYMM' ) ACPT_YM, 20 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-3), 'YYYYMM' ) ACPT_YM, 20 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-4), 'YYYYMM' ) ACPT_YM, 20 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-5), 'YYYYMM' ) ACPT_YM, 20 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-6), 'YYYYMM' ) ACPT_YM, 20 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-1), 'YYYYMM' ) ACPT_YM, 10 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-2), 'YYYYMM' ) ACPT_YM, 10 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-3), 'YYYYMM' ) ACPT_YM, 10 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-4), 'YYYYMM' ) ACPT_YM, 10 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-5), 'YYYYMM' ) ACPT_YM, 10 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-6), 'YYYYMM' ) ACPT_YM, 10 MB_NO FROM DUAL ) SELECT LV, SUM ( CASE WHEN MB_NO = '20' AND TO_CHAR(add_months(sysdate,-5), 'yyyymm' ) = ACPT_YM THEN DECODE(LV,1,LUMP_NSALE_AMT,2,INS_NSALE_AMT,3,SPAY_AMT) END ) SALE_AMT_5, SUM ( CASE WHEN MB_NO = '20' AND TO_CHAR(add_months(sysdate,-4), 'yyyymm' ) = ACPT_YM THEN DECODE(LV,1,LUMP_NSALE_AMT,2,INS_NSALE_AMT,3,SPAY_AMT) END ) SALE_AMT_4, SUM ( CASE WHEN MB_NO = '20' AND TO_CHAR(add_months(sysdate,-3), 'yyyymm' ) = ACPT_YM THEN DECODE(LV,1,LUMP_NSALE_AMT,2,INS_NSALE_AMT,3,SPAY_AMT) END ) SALE_AMT_3, SUM ( CASE WHEN MB_NO = '20' AND TO_CHAR(add_months(sysdate,-2), 'yyyymm' ) = ACPT_YM THEN DECODE(LV,1,LUMP_NSALE_AMT,2,INS_NSALE_AMT,3,SPAY_AMT) END ) SALE_AMT_2, SUM ( CASE WHEN MB_NO = '20' AND TO_CHAR(add_months(sysdate,-1), 'yyyymm' ) = ACPT_YM THEN DECODE(LV,1,LUMP_NSALE_AMT,2,INS_NSALE_AMT,3,SPAY_AMT) END ) SALE_AMT_1, SUM ( CASE WHEN MB_NO = '20' AND TO_CHAR(sysdate, 'yyyymm' ) = ACPT_YM THEN DECODE(LV,1,LUMP_NSALE_AMT,2,INS_NSALE_AMT,3,SPAY_AMT) END ) SALE_AMT, SUM ( DECODE(LV,1,LUMP_NSALE_AMT,2,INS_NSALE_AMT,3,SPAY_AMT) ) AMT_TOT FROM TBDWMERSMBMORCD, ( SELECT level lv FROM dual CONNECT BY level <= 3) --WHERE to_date(ACPT_YM,'yyyymm') < to_date(TO_CHAR(sysdate,'yyyymm'),'yyyymm') WHERE ACPT_YM IN ( TO_CHAR(add_months(sysdate,-5), 'yyyymm' ), TO_CHAR(add_months(sysdate,-4), 'yyyymm' ), TO_CHAR(add_months(sysdate,-3), 'yyyymm' ), TO_CHAR(add_months(sysdate,-2), 'yyyymm' ), TO_CHAR(add_months(sysdate,-1), 'yyyymm' ), TO_CHAR(sysdate, 'yyyymm' ) ) --AND to_date(ACPT_YM,'yyyymm') > add_months(sysdate,-6) GROUP BY CUBE (LV) --, (LV) ) |
oracle
- SQL 횡전개 응용 ORACLE 기준 기본 2011.04.15
- SQL 횡전개 응용 ORACLE 기준 응용 2011.04.15
- Bulk bind 대량 데이터 처리 2009.01.08
- sql 원하는 자리에 - 넣기 2009.01.08
- sql 원 단위를 백만원 단위로 보여주기 2009.01.08
- sql group 함수 2009.01.08
SQL 횡전개 응용 ORACLE 기준 기본
SQL 횡전개 응용 ORACLE 기준 응용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | WITH TBDWMERSMBMORCD AS ( SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-1), 'YYYYMM' ) ACPT_YM, 20 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-2), 'YYYYMM' ) ACPT_YM, 20 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-3), 'YYYYMM' ) ACPT_YM, 20 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-4), 'YYYYMM' ) ACPT_YM, 20 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-5), 'YYYYMM' ) ACPT_YM, 20 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-6), 'YYYYMM' ) ACPT_YM, 20 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-1), 'YYYYMM' ) ACPT_YM, 10 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-2), 'YYYYMM' ) ACPT_YM, 10 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-3), 'YYYYMM' ) ACPT_YM, 10 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-4), 'YYYYMM' ) ACPT_YM, 10 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-5), 'YYYYMM' ) ACPT_YM, 10 MB_NO FROM DUAL UNION ALL SELECT 100 LUMP_NSALE_AMT, 50 INS_NSALE_AMT, 200 SPAY_AMT, TO_CHAR(add_months(SYSDATE,-6), 'YYYYMM' ) ACPT_YM, 10 MB_NO FROM DUAL ) SELECT NVL(MB_NO, 'TOTAL' ) MB_NO, NVL(LV, 'TOTAL' ) LV, SALE_AMT_5, SALE_AMT_4, SALE_AMT_3, SALE_AMT_2, SALE_AMT_1, SALE_AMT FROM ( SELECT MB_NO|| '' MB_NO,LV|| '' LV, SUM ( CASE WHEN TO_CHAR(add_months(sysdate,-5), 'yyyymm' ) = ACPT_YM THEN DECODE(LV,1,LUMP_NSALE_AMT,2,INS_NSALE_AMT,3,SPAY_AMT) END ) SALE_AMT_5, SUM ( CASE WHEN TO_CHAR(add_months(sysdate,-4), 'yyyymm' ) = ACPT_YM THEN DECODE(LV,1,LUMP_NSALE_AMT,2,INS_NSALE_AMT,3,SPAY_AMT) END ) SALE_AMT_4, SUM ( CASE WHEN TO_CHAR(add_months(sysdate,-3), 'yyyymm' ) = ACPT_YM THEN DECODE(LV,1,LUMP_NSALE_AMT,2,INS_NSALE_AMT,3,SPAY_AMT) END ) SALE_AMT_3, SUM ( CASE WHEN TO_CHAR(add_months(sysdate,-2), 'yyyymm' ) = ACPT_YM THEN DECODE(LV,1,LUMP_NSALE_AMT,2,INS_NSALE_AMT,3,SPAY_AMT) END ) SALE_AMT_2, SUM ( CASE WHEN TO_CHAR(add_months(sysdate,-1), 'yyyymm' ) = ACPT_YM THEN DECODE(LV,1,LUMP_NSALE_AMT,2,INS_NSALE_AMT,3,SPAY_AMT) END ) SALE_AMT_1, SUM ( CASE WHEN TO_CHAR(sysdate, 'yyyymm' ) = ACPT_YM THEN DECODE(LV,1,LUMP_NSALE_AMT,2,INS_NSALE_AMT,3,SPAY_AMT) END ) SALE_AMT FROM TBDWMERSMBMORCD, ( SELECT level lv FROM dual CONNECT BY level <= 3) --WHERE to_date(ACPT_YM,'yyyymm') < to_date(TO_CHAR(sysdate,'yyyymm'),'yyyymm') WHERE ACPT_YM IN ( TO_CHAR(add_months(sysdate,-5), 'yyyymm' ), TO_CHAR(add_months(sysdate,-4), 'yyyymm' ), TO_CHAR(add_months(sysdate,-3), 'yyyymm' ), TO_CHAR(add_months(sysdate,-2), 'yyyymm' ), TO_CHAR(add_months(sysdate,-1), 'yyyymm' ), TO_CHAR(sysdate, 'yyyymm' ) ) --AND to_date(ACPT_YM,'yyyymm') > add_months(sysdate,-6) GROUP BY CUBE (MB_NO,LV) --, (LV) ) --AND MER_MGMT_NO = '700000014' ) WHERE MB_NO IS NULL OR MB_NO = 20 ORDER BY 1, 2 |
Bulk bind 대량 데이터 처리
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | --// 일반 FOR 루프 사용 FOR v_i IN p_km_arr. FIRST ..p_km_arr. LAST LOOP update tst_lec_apply_mgr set gaesul_inwon = to_number(p_gaesul_inwon_arr(v_i)), use_yn = upper (p_use_yn_arr(v_i)), ks_cd = to_number(p_kscd_arr(v_i)) where yy = p_yy and hk = p_hk and km = p_km_arr(v_i) and kun = to_number(p_kun_arr(v_i)); END LOOP; --// FORALL 문으로 대량(Bulk) DML 처리방법(Bulk bind) /* 문법: FORALL index_row IN [ lower_bound ... upper_bound | INDICES OF indexing_collection | VALUES OF indexing_collection ] [ SAVE EXCEPTIONS ] sql_statement; */ FORALL v_i IN p_km_arr. FIRST ..p_km_arr. LAST update skky_inwon set gaesul_inwon = to_number(p_gaesul_inwon_arr(v_i)), use_yn = upper (p_use_yn_arr(v_i)), ks_cd = to_number(p_kscd_arr(v_i)) where yy = p_yy and hk = p_hk and km = p_km_arr(v_i) and kun = to_number(p_kun_arr(v_i)); |
sql 원하는 자리에 - 넣기
sql 원 단위를 백만원 단위로 보여주기
1 2 3 4 5 6 7 8 | select substr(a,0,length(a)-6 ) from ( select '123456789123456789' a from dual) ; select trunc(a/1000000) from ( select 123456789123456789 a from dual); select a/1000000 from ( select 123456789123456789 a from dual); |
sql group 함수
GROUP 함수
1 : GROUPING SETS
이 함수는 오라클 이전 버전에서 UNION ALL등을 사용하여 복잡하게 SQL문장을 만드는 부분을 해소 할 수 있도록 한 GROUP BY의 확장이다. 실습을 통해 이해하자.
a 아래는 기존 함수인 GROUP BY를 이용하여 부서별 직업별, 직업별, 관리자별 각각 그룹핑을 한 후 둘을 합친 결과를 얻는 예제이다.
SQL> SELECT deptno, job, NULL, sum(sal)
2 FROM emp
3 GROUP BY deptno, job
4 UNION ALL
5 SELECT NULL, job, mgr, sum(sal)
6 FROM emp
7 GROUP BY job, mgr;
a 아래는 위의 예문과 같은 결과를 내기 위해 GROUPING SET을 이용한 사례 이다.
SQL> SELECT deptno, job, mgr, sum(sal)
2 FROM emp
3 GROUP BY GROUPING SETS ((deptno, job), (job, mgr));
2: ROLLUP
ROLLUP 함수는 오라클 8i에서 소개된 것으로 주로 GROUP BY와 같이 사용되며 주어진 Grouping 조건에 따라 각 그룹의 그룹핑 항목이 있으면 우측부터 하나씩 제외 하면서 그 결과를 반환한다.
a 아래는 GROUP BY 만을 이용하여 부서별 급여의 합을 구했다.
SQL> select deptno, sum(sal)
2 from emp
3 group by deptno;
DEPTNO SUM(SAL)
---------- ----------
10 6500
20 10875
30 8150
a 아래는 rollup을 group by와 같이 사용하여 부서별 합을 출력하면서 그룹핑 항목인 부서가 제외되는 마지막에 sal의 전체 합을 출력 했다.
SQL> select deptno, sum(sal)
2 from emp
3 group by rollup(deptno);
DEPTNO SUM(SAL)
---------- ----------
10 6500
20 10875
30 8150
25525 ß EMP Table 전체 급여 합계
SQL> select deptno, avg(sal)
2 from emp
3 group by rollup(deptno);
DEPTNO AVG(SAL)
---------- ----------
10 1300
20 2175
30 1630
1701.66667 ß EMP Table 전체 급여 평균
SQL> select deptno, job, sum(sal)
2 from emp
3 group by rollup(deptno, job)
DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 SALESMAN 1250
10 PRESIDENT
10 5000 <==10번 부서 SUBTOTAL
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
20 10875 <==20번 부서 SUBTOTAL
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 4350
30 8150 <==30번 부서 SUBTOTAL
24025 <== 전체 TOTAL
3: CUBE
CUBE 함수는 오라클 8i에서 소개된 것으로 이전 ROLLUP 연산자가 수행 한 결과에 부가적으로 그룹핑 조건이 가능한 모든 조합에 대한 결과를 출력한다.
SQL> select deptno, job, sum(sal)
2 from emp
3 group by cube(deptno, job);
DEPTNO JOB SUM(SAL)
---------- --------- ----------
24025 <== 전체 TOTAL
CLERK 4150 <== CLERK SUBTOTAL
ANALYST 6000 <== ANALYST SUBTOTAL
MANAGER 8275 <== MANAGER SUBTOTAL
SALESMAN 5600 <== SALESMAN SUBTOTAL
PRESIDENT <== PRESIDENT SUBTOTAL
10 5000 <==10번 부서 SUBTOTAL
10 CLERK 1300
10 MANAGER 2450
10 SALESMAN 1250
10 PRESIDENT
20 10875 <==20번 부서 SUBTOTAL
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
30 8150 <==30번 부서 SUBTOTAL
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 4350
19 개의 행이 선택되었습니다.
ROLLUP 과 CUBE 차이
select deptno, job, sum(sal)
from emp
group by rollup(deptno, job);
부서별합 + 전체합
select deptno, job, sum(sal)
from emp
group by cube(deptno, job);
부서별합 + 잡별합 + 전체합