쿼리 질문입니다. 0 9 1,340

by 뉴스쿨84 [2013.10.17 09:54:54]



안녕하세요.
혼자서 고민해보다가 해결방법을 찾을 수 없어서 질문하나 드립니다.
조인을 사용하지 않고 해결해야 하는데요

DATE JOB QTY VERSION
201310 A 50 BASE
201310 A 50 BASE
201310 A 100 20131016_002
201310 A 100 20131016_002
201310 B 50 BASE
201310 B 50 BASE
201310 B 100 20131016_002
201310 B 100 20131016_002
201310 B 100 20131016_002
201310 C 50 BASE
201310 C 50 BASE
201310 C 100 20131016_002
201310 C 100 20131016_002
201310 C 100 20131016_002
201310 D 50 BASE
201310 D 50 BASE

결과

DATE JOB QTY VERSION
201310 A 200 20131016_002
201310 B 300 20131016_002
201310 C 300 20131016_002
201310 D 100 BASE


데이터는 위 와 같습니다.

DATA, JOB, QTY그룹으로 보았을때 VERSION 컬럼에 BASE와 다른값이 있다면 BASE를 제외한 값을 합산하고
BASE가 있을 경우에만 BASE 값을 합산해야 하는데요 조인을 사용하지 않고 해보려니깐
해결방법을 못찾겠어요
방법이 있을가요?
by 마농 [2013.10.17 10:13:11]
데이터를 보면 버전이 동일한데...
동일한 일자, Job에 대해 버전이 서로 다를 경우 어떻게 결과가 나오게 될까요?

by 뉴스쿨84 [2013.10.17 10:35:38]

네 안녕하세요
VERSION 값은 BASE와 BASE가 아닌경우만 보면 될 것 같습니다.
버전값이 아래와 같이 되어 있더라도 결과값은 동일합니다.

20131016_002
20131016_003


by 마농 [2013.10.17 10:38:33]
결과값이 동일하다구요?
결과에 버전을 표시하도록 되어 있는데.
둘 중 어떤걸 보여줘야 하는지에 대한 고민을 해야 합니다.

by 뉴스쿨84 [2013.10.17 11:42:45]

ATE, JOB, QTY를 그룹으로보고 VERSION 컬럼에 BASE와 다른 값이 있다면
BASE 이외값 QYT값 SUM이고 DATE, JOB, QTY를 그룹에서 BASE값만 있다면
BASE 값 QTY를 SUM 하려고 하는데 단순히 VESRION은 어떤 것을 합산했느냐의
표시정도로 보면 문제는 없을가요?


by 마농 [2013.10.17 13:42:53]
그룹바이에 대한 이해도가 부족하신 듯 합니다.
그룹의 기준은 ATE, JOB 이죠.
QTY, VERSION 은 그룹의 기준항목이 아니죠.
그룹의 기준항목이 아닌 값을 표현하려면 집계함수를 사용해야만 하구요.
그래서 QTY 는 SUM 함수를 사용해서 표현해야 하는거죠.
VERSION 표시는 큰 의미가 없다면 그냥 MAX 하시면 될 듯 하네요.

by 뉴스쿨84 [2013.10.17 19:57:33]

감사합니다.
제가 아직 부족한점이 많은것 같습니다.
앞으로 좀 더 노력해야 겠어요 ^^:;


by 우리집아찌 [2013.10.17 10:13:18]
 
-- 항상 답에만 맞춤
WITH T ( DT ,JOB ,QTY ,VERSION) AS (
SELECT '201310','A',50 ,'BASE'  FROM DUAL UNION ALL
SELECT '201310','A',50 ,'BASE'   FROM DUAL UNION ALL
SELECT '201310','A',100,'20131016_002' FROM DUAL UNION ALL
SELECT '201310','A',100,'20131016_002' FROM DUAL UNION ALL
SELECT '201310','B',50 ,'BASE' FROM DUAL UNION ALL
SELECT '201310','B',50 ,'BASE' FROM DUAL UNION ALL
SELECT '201310','B',100,'20131016_002' FROM DUAL UNION ALL
SELECT '201310','B',100,'20131016_002' FROM DUAL UNION ALL
SELECT '201310','B',100,'20131016_002' FROM DUAL UNION ALL
SELECT '201310','C',50 ,'BASE' FROM DUAL UNION ALL
SELECT '201310','C',50 ,'BASE' FROM DUAL UNION ALL
SELECT '201310','C',100,'20131016_002' FROM DUAL UNION ALL
SELECT '201310','C',100,'20131016_002' FROM DUAL UNION ALL
SELECT '201310','C',100,'20131016_002' FROM DUAL UNION ALL
SELECT '201310','D',50 ,'BASE' FROM DUAL UNION ALL
SELECT '201310','D',50 ,'BASE' FROM DUAL 
)
SELECT DT , JOB 
   , DECODE(ETC_SUM,0,BASE_SUM,ETC_SUM) QTY 
   , DECODE(ETC_SUM,0,'BASE',VERSION) VERSION
FROM
(SELECT DT 
   , JOB 
   , SUM(DECODE(VERSION,'BASE',QTY )) BASE_SUM
   , SUM(DECODE(VERSION,'BASE',0,QTY ))ETC_SUM 
   , MAX(DECODE(VERSION,'BASE','',VERSION)) VERSION
FROM T 
GROUP BY DT , JOB )
ORDER BY DT , JOB
 

by 뉴스쿨84 [2013.10.17 19:56:49]

감사합니다.
도움이 되었어요.
앞으로 공부더 열심히해서 저도 여기에 답글을 될 수 있도록 할게요~!


by 마농 [2013.10.17 14:11:35]
WITH t AS
(
SELECT '201310' dat, 'A' job, 50 qty, 'BASE' version FROM dual
UNION ALL SELECT '201310', 'A',  50, 'BASE'         FROM dual
UNION ALL SELECT '201310', 'A', 100, '20131016_002' FROM dual
UNION ALL SELECT '201310', 'A', 100, '20131016_002' FROM dual
UNION ALL SELECT '201310', 'B',  50, 'BASE'         FROM dual
UNION ALL SELECT '201310', 'B',  50, 'BASE'         FROM dual
UNION ALL SELECT '201310', 'B', 100, '20131016_002' FROM dual
UNION ALL SELECT '201310', 'B', 100, '20131016_002' FROM dual
UNION ALL SELECT '201310', 'B', 100, '20131016_002' FROM dual
UNION ALL SELECT '201310', 'C',  50, 'BASE'         FROM dual
UNION ALL SELECT '201310', 'C',  50, 'BASE'         FROM dual
UNION ALL SELECT '201310', 'C', 100, '20131016_002' FROM dual
UNION ALL SELECT '201310', 'C', 100, '20131016_002' FROM dual
UNION ALL SELECT '201310', 'C', 100, '20131016_002' FROM dual
UNION ALL SELECT '201310', 'D',  50, 'BASE'         FROM dual
UNION ALL SELECT '201310', 'D',  50, 'BASE'         FROM dual
)
SELECT dat
     , job
     , SUM(qty) qty
     , MAX(version) version
  FROM (SELECT dat, job, qty, version
             , RANK() OVER(PARTITION BY dat, job ORDER BY DECODE(version, 'BASE', 1, 0)) rk
          FROM t
        )
 WHERE rk = 1
 GROUP BY dat, job
 ORDER BY dat, job
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입