안녕하세요.
혼자 못하겟어요. 도움을 요청드립니다.
* 현재 데이타
deptcd1 | deptcd2 | empcd | week | gbn | qty |
100 | 101 | 1001 | 1 | 2. 당월 | 1,547 |
100 | 101 | 1001 | 1 | 3. 차월 | 1,000 |
200 | 201 | 1002 | 1 | 1. 전월 | 800 |
200 | 201 | 1002 | 1 | 2. 당월 | 700 |
200 | 201 | 1002 | 1 | 3. 차월 | 500 |
200 | 201 | 1002 | 2 | 1. 전월 | 500 |
200 | 201 | 1002 | 2 | 2. 당월 | 500 |
* 원하는 결과값
deptcd1 | deptcd2 | empcd | week | gbn | qty | |
100 | 101 | 1001 | 1 | 1. 전월 | 0 | <- 추가 |
100 | 101 | 1001 | 1 | 2. 당월 | 1,547 | |
100 | 101 | 1001 | 1 | 3. 차월 | 1,000 | |
100 | 101 | 1001 | 1 | 소계 | 2,547 | <- 소계 |
200 | 201 | 1002 | 1 | 1. 전월 | 800 | |
200 | 201 | 1002 | 1 | 2. 당월 | 700 | |
200 | 201 | 1002 | 1 | 3. 차월 | 500 | |
200 | 201 | 1002 | 1 | 소계 | 2,000 | <- 소계 |
200 | 201 | 1002 | 2 | 1. 전월 | 500 | |
200 | 201 | 1002 | 2 | 2. 당월 | 500 | |
200 | 201 | 1002 | 2 | 3. 차월 | 0 | <- 추가 |
200 | 201 | 1002 | 2 | 소계 | 1,000 | <- 소계 |
1. 구분값이 없어도 당월, 전월, 차월이 보여졌으면 좋겟습니다. (수량=0)
2. DEPT1, DEPTCD2, EMPCD, WEEK별 소계를 보여주고 싶습니다.
SELECT DECODE(LEVEL, 1, '1.전월', 2, '2.당월', '3.차월') AS GBN
FROM DUAL
CONNECT BY LEVEL <= (SELECT 3 FROM DUAL)
테이블을 만들고 아웃조인을 걸면 해결이 될까 햇는데... 어렵네요.
쿼리문좀 만들어 주세요
WITH TMP01(deptcd1, deptcd2, empcd, week, gbn, qty) AS ( SELECT '100', '101', '1001', '1', '2.당월', 1547 FROM DUAL UNION ALL SELECT '100', '101', '1001', '1', '3.차월', 1000 FROM DUAL UNION ALL SELECT '200', '201', '1002', '1', '1.전월', 800 FROM DUAL UNION ALL SELECT '200', '201', '1002', '1', '2.당월', 700 FROM DUAL UNION ALL SELECT '200', '201', '1002', '1', '3.차월', 500 FROM DUAL UNION ALL SELECT '200', '201', '1002', '2', '1.전월', 500 FROM DUAL UNION ALL SELECT '200', '201', '1002', '2', '2.당월', 500 FROM DUAL ) SELECT T1.DEPTCD1, T1.DEPTCD2, T1.EMPCD, T1.WEEK , DECODE(GROUPING(T1.GBN), 1, '소계', T1.GBN) AS GBN , NVL(SUM(T2.QTY), 0) AS QTY FROM ( SELECT A.DEPTCD1, A.DEPTCD2, A.EMPCD, A.WEEK , DECODE(B.LV, 1, '1.전월', 2, '2.당월', '3.차월') AS GBN FROM (SELECT DISTINCT DEPTCD1, DEPTCD2, EMPCD, WEEK FROM TMP01) A , (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 3) B ) T1, TMP01 T2 WHERE T1.DEPTCD1 = T2.DEPTCD1(+) AND T1.DEPTCD2 = T2.DEPTCD2(+) AND T1.EMPCD = T2.EMPCD(+) AND T1.WEEK = T2.WEEK(+) AND T1.GBN = T2.GBN(+) GROUP BY T1.DEPTCD1, T1.DEPTCD2, T1.EMPCD, T1.WEEK, ROLLUP(T1.GBN)
좋은 해결책을 주셔서 감사합니다.
근데 문제는 원본데이타가 하나의 테이블에 있는 값이 아니라 다수의 테이블을 조인해야 나오는 값이라,
(* 생성하신 TMP01 테이블은 하나의 테이블에서 나오는 데이타가 아니라 여러개의 테이블의 조합으로 생성한 데이타입니다.)
SELECT DISTINCT
DEPTCD1, DEPTCD2, EMPCD, WEEK
FROM
TMP01 /
) T1, TMP01 T2
와 같이 사용하기에 부담이 있습니다.
TMP01 TABLE을 여러번 사용하지 않고 구할 수 있는 방법은 없을까요?
TMP01 테이블 또한 하나의 테이블이 아니라 여러개 테이블의 조인으로 구해진 값인지라,
-- 1. Partition Outer Join -- SELECT b.deptcd1, b.deptcd2, b.empcd, b.week , NVL(a.gbn, '소계') gbn , NVL(SUM(b.qty), 0) qty FROM (SELECT DECODE(LEVEL, 1, '1. 전월', 2, '2. 당월', 3, '3. 차월') gbn FROM dual CONNECT BY LEVEL <= 3 ) a LEFT OUTER JOIN tmp01 b PARTITION BY (b.deptcd1, b.deptcd2, b.empcd, b.week) ON a.gbn = b.gbn GROUP BY b.deptcd1, b.deptcd2, b.empcd, b.week , ROLLUP(a.gbn) ORDER BY b.deptcd1, b.deptcd2, b.empcd, b.week, a.gbn ;
-- 2. Model -- SELECT * FROM tmp01 MODEL PARTITION BY (deptcd1, deptcd2, empcd, week) DIMENSION BY (gbn) MEASURES (qty) IGNORE NAV RULES ( qty[FOR gbn IN ('1. 전월', '2. 당월', '3. 차월')] = qty[CV()] , qty['소계'] = SUM(qty)[ANY] ) ORDER BY deptcd1, deptcd2, empcd, week, gbn ;