쿼리 질문입니다. 고수님들의 은총을 기다리고 있습니다. ㅠㅠ 0 7 2,264

by 백수마적 피봇 인포믹스 [2011.12.16 09:55:46]


아래 좌측의 데이터를 화살표(→) 우측에 있는 데이터 형식으로 보여주려 합니다.
즉 구분과 계좌가 기준이 되어 
구분값이 '2'인 계좌의 데이터를 가지고  동일한 사원의 다른 데이터들의 계좌2, 계좌1을 서로 비교하여
계좌2가 같으면 해당 점유율과 금액을 더해주고,
계좌1이 같으면 해당 점유율과 금액을 빼줘야 합니다.
그래서 결과적으로는 화살표 우측에 있는 데이터 형식으로 보여주어야 합니다.
CASE를 사용해서 피봇처럼 하려고 해보았는데, 막혔습니다. ㅠㅠ
고수님들의 은총을 갈구합니다.



구분    년월    부서    사번        계좌2   계좌1   점유율  금액    →    계좌    점유율  금액
1        201106  B370    19852579    A       A       25      1940967 A        42.26    3280855
1        201106  B370    19852579    B       B       10      776387 B        10        776387
1        201106  B370    19852579    C       C       34      2639719 C        16.74    1299831
2        201106  B370    19852579    A       C       17.26    1339888
1        201106  B370    19852579    D       D       20      1552773 D        20        1552773
1        201106  B370    19852579    E       E       11      854012 E        11        854012
1        201106  C240    19976445    F       F       40.1    3287136 F        40.1    3287136
1        201106  C240    19976445    G       G       10      819735 G        8.78    719735
2        201106  C240    19976445    H       G       1.22    100000 H        1.22    100000
1        201106  C240    19976445    I       I       18.45   1512412 I        18.45    1512412
1        201106  C240    19976445    J       J       4.64    380361 J        4.64    380361
1        201106  C240    19976445    K       K       5.22    427906 K        5.22    427906
1        201106  C240    19976445    L       L       21.59   1769786 L        21.59    1769786
1        201106  D330    20100353    M       M       10      561653 M        10        561653
1        201106  D330    20100353    O       O       5       280829 O        5        280829
1        201106  D330    20100353    P       P       10      561653 P       10        561653
1        201106  D330    20100353    Q       Q       45      2527431
2        201106  D330    20100353    R       Q       45      2527431 R        45        2527431
1        201106  D330    20100353    S       S       30      1684939 S        30      1684939



by 힘센올챙이 [2011.12.16 15:58:46]
이상한점이 있는데요...
구분이 2인 데이타를 기준으로 출력을 해주는데
구분2인 애들중에서 어떤 데이타는 계좌/점유율/금액이 보이고, 어떤 데이타는 계좌/점유율/금액이 보이지않네요.
사번이 19852579번이고 구분이 2인 데이타는 출력이 없는게 맞나요??
우선 아래 대충 만들어봤어요

WITH T AS
(
SELECT '1' GBN, '201106' YYYYMM, 'B370' DEPTNO, '19852579' EMPNO, 'A' ACNO2, 'A' ACNO1, 25 PERCENTAGE, 1940967 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'B370' DEPTNO, '19852579' EMPNO, 'B' ACNO2, 'B' ACNO1, 10 PERCENTAGE, 776387 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'B370' DEPTNO, '19852579' EMPNO, 'C' ACNO2, 'C' ACNO1, 34 PERCENTAGE, 2639719 AMT FROM DUAL UNION ALL
SELECT '2' GBN, '201106' YYYYMM, 'B370' DEPTNO, '19852579' EMPNO, 'A' ACNO2, 'C' ACNO1, 17.26 PERCENTAGE, 1339888 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'B370' DEPTNO, '19852579' EMPNO, 'D' ACNO2, 'D' ACNO1, 20 PERCENTAGE, 1552773 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'B370' DEPTNO, '19852579' EMPNO, 'E' ACNO2, 'E' ACNO1, 11 PERCENTAGE, 854012 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'C240' DEPTNO, '19976445' EMPNO, 'F' ACNO2, 'F' ACNO1, 40.1 PERCENTAGE, 3287136 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'C240' DEPTNO, '19976445' EMPNO, 'G' ACNO2, 'G' ACNO1, 10 PERCENTAGE, 819735 AMT FROM DUAL UNION ALL
SELECT '2' GBN, '201106' YYYYMM, 'C240' DEPTNO, '19976445' EMPNO, 'H' ACNO2, 'G' ACNO1, 1.22 PERCENTAGE, 100000 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'C240' DEPTNO, '19976445' EMPNO, 'I' ACNO2, 'I' ACNO1, 18.45 PERCENTAGE, 1512412 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'C240' DEPTNO, '19976445' EMPNO, 'J' ACNO2, 'J' ACNO1, 4.64 PERCENTAGE, 380361 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'C240' DEPTNO, '19976445' EMPNO, 'K' ACNO2, 'K' ACNO1, 5.22 PERCENTAGE, 427906 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'C240' DEPTNO, '19976445' EMPNO, 'L' ACNO2, 'L' ACNO1, 21.59 PERCENTAGE, 1769786 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'D330' DEPTNO, '20100353' EMPNO, 'M' ACNO2, 'M' ACNO1, 10 PERCENTAGE, 561653 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'D330' DEPTNO, '20100353' EMPNO, 'O' ACNO2, 'O' ACNO1, 5 PERCENTAGE, 280829 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'D330' DEPTNO, '20100353' EMPNO, 'P' ACNO2, 'P' ACNO1, 10 PERCENTAGE, 561653 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'D330' DEPTNO, '20100353' EMPNO, 'Q' ACNO2, 'Q' ACNO1, 45 PERCENTAGE, 2527431 AMT FROM DUAL UNION ALL
SELECT '2' GBN, '201106' YYYYMM, 'D330' DEPTNO, '20100353' EMPNO, 'R' ACNO2, 'Q' ACNO1, 45 PERCENTAGE, 2527431 AMT FROM DUAL UNION ALL
SELECT '1' GBN, '201106' YYYYMM, 'D330' DEPTNO, '20100353' EMPNO, 'S' ACNO2, 'S' ACNO1, 30 PERCENTAGE, 1684939 AMT FROM DUAL
)
SELECT T2.EMPNO, T1.GBN, T1.ACNO2, T1.ACNO1
, CASE WHEN T2.ACNO2 = T1.ACNO2 AND T2.ACNO1 = T1.ACNO1
THEN T2.PERCENTAGE
WHEN T2.ACNO2 = T1.ACNO2
THEN T2.PERCENTAGE + T1.PERCENTAGE
WHEN T2.ACNO1 = T1.ACNO1
THEN T2.PERCENTAGE - T1.PERCENTAGE
ELSE T1.PERCENTAGE
END PERCENTAGE
, CASE WHEN T2.ACNO2 = T1.ACNO2 AND T2.ACNO1 = T1.ACNO1
THEN T2.AMT
WHEN T2.ACNO2 = T1.ACNO2
THEN T2.AMT + T1.AMT
WHEN T2.ACNO1 = T1.ACNO1
THEN T2.AMT - T1.AMT
ELSE T1.AMT
END AMT
FROM T T1,
( SELECT *
FROM T
WHERE GBN = '2'
) T2
WHERE T1.EMPNO = T2.EMPNO
ORDER BY T1.DEPTNO

by 백수마적 [2011.12.19 10:40:12]
네. 계좌2를 기준으로 해서 보여줘야 하기에 계산이 종료되면 오른쪽의 결과로 보여주어야 하는 겁니다. 그래서 일부 데이터는 계산에 의해 합산되어 사라지게 됩니다. 힘센올챙이님의 친절한 답변에 감사드리며 재빨리 확인해 보도록 하겠습니다. 혹시 제 능력으로 적용이 어려우면 다시 질문을 올릴테니 다음에도 부탁드리겠습니다.ㅠㅠ 얼마남지 않은 2011년 알차게 보내시기 바랍니다. 감사합니다.

by 백수마적 [2011.12.19 11:56:03]
아. 첫번째 사원의 경우는 데이터가 맞습니다만, 두번째 세번째 사원의 경우는 H계좌에 1.22%, R계좌로 45%의 데이터가 나와야 합니다. 일단 먼저 고민해 보겠습니다. ㅠㅠ

by 백수마적 [2011.12.19 16:32:31]
안되네요. 그저 눈물만 흐를 뿐...ㅠㅠ

by 백수마적 [2011.12.19 18:22:31]
다시 한 번 맞춰보니 데이터가 17건만 나와야 하는데 19건이 나오네요. 우측에 있는 데이터처럼 첫번째 사원은 A계정과 C계정에 17.26 퍼센트가 더해지고, 빼줘야합니다.
계산후엔 17.26퍼센트의 데이터는 추출하지 않고 건수가 하나 줄어들게 되는 거죠. 세번째 사원의 Q계정도 마찬가지로 45%가 빼지므로 값이 0이 되어서 한 건이 줄게 되는 것입니다.

by 마농 [2011.12.20 16:10:55]
WITH t AS
(
SELECT 1 gb, '201106' ym, 'B370' dep, '19852579' emp, 'A' cd1, 'A' cd2, 25 rat, 1940967 amt FROM dual
UNION ALL SELECT 1, '201106', 'B370', '19852579', 'B', 'B', 10 , 776387 FROM dual
UNION ALL SELECT 1, '201106', 'B370', '19852579', 'C', 'C', 34 , 2639719 FROM dual
UNION ALL SELECT 2, '201106', 'B370', '19852579', 'A', 'C', 17.26, 1339888 FROM dual
UNION ALL SELECT 1, '201106', 'B370', '19852579', 'D', 'D', 20 , 1552773 FROM dual
UNION ALL SELECT 1, '201106', 'B370', '19852579', 'E', 'E', 11 , 854012 FROM dual
UNION ALL SELECT 1, '201106', 'C240', '19976445', 'F', 'F', 40.1 , 3287136 FROM dual
UNION ALL SELECT 1, '201106', 'C240', '19976445', 'G', 'G', 10 , 819735 FROM dual
UNION ALL SELECT 2, '201106', 'C240', '19976445', 'H', 'G', 1.22 , 100000 FROM dual
UNION ALL SELECT 1, '201106', 'C240', '19976445', 'I', 'I', 18.45, 1512412 FROM dual
UNION ALL SELECT 1, '201106', 'C240', '19976445', 'J', 'J', 4.64 , 380361 FROM dual
UNION ALL SELECT 1, '201106', 'C240', '19976445', 'K', 'K', 5.22 , 427906 FROM dual
UNION ALL SELECT 1, '201106', 'C240', '19976445', 'L', 'L', 21.59, 1769786 FROM dual
UNION ALL SELECT 1, '201106', 'D330', '20100353', 'M', 'M', 10 , 561653 FROM dual
UNION ALL SELECT 1, '201106', 'D330', '20100353', 'O', 'O', 5 , 280829 FROM dual
UNION ALL SELECT 1, '201106', 'D330', '20100353', 'P', 'P', 10 , 561653 FROM dual
UNION ALL SELECT 1, '201106', 'D330', '20100353', 'Q', 'Q', 45 , 2527431 FROM dual
UNION ALL SELECT 2, '201106', 'D330', '20100353', 'R', 'Q', 45 , 2527431 FROM dual
UNION ALL SELECT 1, '201106', 'D330', '20100353', 'S', 'S', 30 , 1684939 FROM dual
)
SELECT ym, dep, emp
, cd
, SUM(rat) rat
, SUM(amt) amt
FROM
(
SELECT ym, dep, emp
, DECODE(lv, 1, cd1, cd2) cd
, DECODE(lv, 1, rat, -rat) rat
, DECODE(lv, 1, amt, -amt) amt
FROM t
, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 2)
WHERE lv <= gb
AND ym = '201106'
)
GROUP BY ym, dep, emp, cd
HAVING SUM(amt) <> 0
ORDER BY ym, dep, emp, cd
;

by 백수마적 [2011.12.21 19:50:41]
힘센올챙이님, 마농님. 정말 감사합니다.
정말 많은 도움이 되었습니다.
나중에 저도 두 분처럼 다른 분들을 도와줄 날이 어서 오기를 ㅠㅠ.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입