트리 구조 병합 기능 0 10 412

by MS [SQL Query] [2018.02.09 14:34:01]


packAll.png (7,651Bytes)

그림에서 처럼 트리 구조의 자식이 반복되면 병합하고 수량을 합치는 기능입니다.

 start with ~ connect by prior를 이용해 해보려는 데 잘 안되네요.

by 마농 [2018.02.09 14:47:13]

원본 테이블을 보여주세요.
사용 쿼리를 보여주세요.


by MS [2018.02.09 16:05:14]

아! 실수 했네요. 질문을 받고 보니 아주 잘못된 그림이었네요. 다시 질문드립니다.

변경전                                                             

seq parent child qty
1 -1 100  
2 100 102 1
3 100 103 1
4 103 104 1
5 103 104 1
6 100 105 1
7 105 106 1
8 105 106 1

변경후

seq parent child qty
1 -1 100  
2 100 102 1
3 100 103 2
4 103 104 1
5 100 105 1
6 105 106 2

by 마농 [2018.02.09 16:12:59]

106 이 중복이라서 2개가 되는데?
104 가 중복인데? 왜 103 이 2개가 되죠?
기준이 제각각인가요? 원본을 잘못 올리신건가요?


by MS [2018.02.09 16:27:03]

모자 구조로 되어 있고 수량은 사용된 숫자 인데요.

103과 104는 모자 구조입니다.

수량은 사용 된 수 인데요. 106은 105에 의해 두번 사용되었고요.

103은 100 부모에 의해 두번 사용된 구조 이기 때문에

103과 106의 수량이 2 입니다.

 


by 마농 [2018.02.09 16:32:38]

네. 설명과 데이터가 다르네요?
설명은 103 이 중복이지만, 자료는 104 가 중복이네요?
설명이 맞고 자료가 틀린거겠죠?


by 마농 [2018.02.09 16:34:05]
WITH t AS
(
SELECT 100 cd, -1 pcd, null qty FROM dual
UNION ALL SELECT 102, 100, 1 FROM dual
UNION ALL SELECT 103, 100, 1 FROM dual
UNION ALL SELECT 103, 100, 1 FROM dual    -- 자료 수정
UNION ALL SELECT 104, 103, 1 FROM dual
UNION ALL SELECT 105, 100, 1 FROM dual
UNION ALL SELECT 106, 105, 1 FROM dual
UNION ALL SELECT 106, 105, 1 FROM dual
)
SELECT *
  FROM (SELECT cd, pcd
             , SUM(qty) qty
          FROM t
         GROUP BY cd, pcd
        )
 START WITH pcd = -1
 CONNECT BY PRIOR cd = pcd
;

 


by MS [2018.02.09 16:40:22]

아니요. 103부모에게는 항상 104가 한번씩 사용되기 때문입니다.

물론 실제로는 104도 두번 사용되었지만 모자 관계에서는 103의 수량에 관계없이 항상 일정합니다.


by 마농 [2018.02.09 16:46:15]

설명은 맞습니다. 이해 다 했구요...
올려주신 자료가 반대에요..
잘 살펴보세요.
-- 올려주신 자료 --
  3 100 103 1   <--- 103 1건
  4 103 104 1   <--- 104 2건
  5 103 104 1   <--- 104 2건
-- 예상되는 자료 --
  3 100 103 1   <--- 103 2건
  4 100 103 1   <--- 103 2건
  5 103 104 1   <--- 104 1건


by MS [2018.02.09 16:55:38]

감사합니다. 네. 처음에 올린 자료가 잘못됐습니다. 매번 신중히 본다고 해도 실수가 생기네요.

그런데 SUM으로만 된다는 게 정말 놀랍습니다.


by 마농 [2018.02.09 17:06:14]

트리구조를 병합한다고 생각해서 어려웠던거 아닌가 생각되네요?
그냥 병합만 생각했으면 쉬운 문제인데요.

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