전월, 당월, 차월 값이 반복적으로 생성되는 쿼리문 부탁드려요. 1 4 2,101

by 잼보야 [2015.09.18 10:07:09]


안녕하세요.

혼자 못하겟어요. 도움을 요청드립니다.

* 현재 데이타

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)

테이블을 만들고 아웃조인을 걸면 해결이 될까 햇는데... 어렵네요.

 

쿼리문좀 만들어 주세요

 

 

by Jason [2015.09.18 10:44:40]
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)

 


by 잼보야 [2015.09.18 10:51:15]

좋은 해결책을 주셔서 감사합니다.

근데 문제는 원본데이타가 하나의 테이블에 있는 값이 아니라 다수의 테이블을 조인해야 나오는 값이라,

(* 생성하신 TMP01 테이블은 하나의 테이블에서 나오는 데이타가 아니라 여러개의 테이블의 조합으로 생성한 데이타입니다.)

SELECT DISTINCT DEPTCD1, DEPTCD2, EMPCD, WEEK FROM TMP01 /

) T1, TMP01 T2 

와 같이 사용하기에 부담이 있습니다.

TMP01 TABLE을 여러번 사용하지 않고 구할 수 있는 방법은 없을까요?

 

TMP01 테이블 또한 하나의 테이블이 아니라 여러개 테이블의 조인으로 구해진 값인지라,

 


by 마농 [2015.09.18 10:54:06]
-- 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
;

 


by 잼보야 [2015.09.18 11:37:19]

우와~ 마농님 감사합니다.

매번 느끼지만 역시 대단하세요.

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입