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) )
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
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));
1
select replace(to_char(1111111111,'999,99,99999'),',','-') from dual;
이것 말고 더좋은거 있나요? 있으면 알려주세요
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);
이렇게 하면 되는데 더 좋은거 아시면 알려주세요.

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);
부서별합 + 잡별합 + 전체합


+ Recent posts