하위 값을 판단하여, 상위 DATA를 값 변환 도움 요청 드려요 0 4 1,092

by 초봉 [SQL Query] [2022.10.06 15:13:03]


안녕하세요 쿼리 짜는 도중 잘 안되서 고수님들 도움 요청 드립니다.

SELECT 'A' AS CD, '' AS UP_CD, '기준관리' AS NM,  'Y' AS YN  FROM DUAL

UNION ALL

SELECT 'A-1' AS CD,  'A' AS UP_CD,   '은행관리' AS NM,   'Y' AS YN FROM DUAL

UNION ALL

SELECT 'A-2' AS CD,  'A' AS UP_CD,  '계좌관리' AS NM,  'N' AS YN FROM DUAL

UNION ALL

SELECT 'B' AS CD,  '' AS UP_CD,   '기준관리' AS NM,   'Y' AS YN FROM DUAL

UNION ALL

SELECT 'B-1' AS CD,   'B' AS UP_CD,    '은행관리' AS NM,   'Y' AS YN FROM DUAL

UNION ALL

SELECT 'B-1-1' AS CD,   'B-1' AS UP_CD,   '계좌관리' AS NM,   'N' AS YN FROM DUAL

UNION ALL

SELECT 'C' AS CD,   '' AS UP_CD,   '기준관리' AS NM,    'Y' AS YN FROM DUAL

UNION ALL

SELECT 'C-1' AS CD,   'C' AS UP_CD,   '은행관리' AS NM,  'N' AS YN FROM DUAL

UNION ALL

SELECT 'C-2' AS CD,  'C' AS UP_CD,  '계좌관리' AS NM,   'N' AS YN FROM DUAL

 

예시 DATA는 위와 같으며, 조회시 아래와 같이 조회됩니다.

CD UP_CD NM YN
A   기준관리 Y
A-1 A 은행관리 Y
A-2 A 계좌관리 N
B   기준관리 Y
B-1 B 은행관리 Y
B-1-1 B-1 계좌관리 N
C   기준관리 Y
C-1 C 은행관리 N
C-2 C 계좌관리 N

이렇게 조회되는것을 아래 처럼 YN 값이 N 인경우는 조회를 안하며, 상위 값에서 하위 값이 존재하지 않을때 같이 조회되지 않았으면 합니다.

CD UP_CD NM YN
A   기준관리 Y
A-1 A 은행관리 Y

위와 같이 조회가 되면 되는데 어렵네요 ㅜㅜ 도움 부탁 드립니다

by 마농 [2022.10.06 15:42:02]

혹시 자료 중에 부모는 N 인데 자식은 Y 인 경우는 없나요?
그런 경우가 있다면 결과가 어떻게 나와야 하나요?
예를 들어 다음과 같은 자료가 존재할 경우 결과는 어떻게 나와야 하나요?
D, _, Y
E, D, N
F, E, Y
 


by 초봉 [2022.10.06 15:54:14]

부모는 N인데 자식이 Y이라면 자식까지 안보여야 합니다. 이게 메뉴 트리 형태 하는거라서요
다 N 상태처럼 되야 하는거죠


by 마농 [2022.10.06 17:06:49]
WITH t AS
(
SELECT 'A' cd, '' up_cd, '기준관리' nm, 'Y' yn  FROM dual
UNION ALL SELECT 'A-1'  , 'A'  , '은행관리', 'Y' FROM dual
UNION ALL SELECT 'A-2'  , 'A'  , '계좌관리', 'N' FROM dual
UNION ALL SELECT 'B'    , ''   , '기준관리', 'Y' FROM dual
UNION ALL SELECT 'B-1'  , 'B'  , '은행관리', 'Y' FROM dual
UNION ALL SELECT 'B-1-1', 'B-1', '계좌관리', 'N' FROM dual
UNION ALL SELECT 'C'    , ''   , '기준관리', 'Y' FROM dual
UNION ALL SELECT 'C-1'  , 'C'  , '은행관리', 'N' FROM dual
UNION ALL SELECT 'C-2'  , 'C'  , '계좌관리', 'N' FROM dual
UNION ALL SELECT 'D'    , ''   , '기준관리', 'Y' FROM dual
UNION ALL SELECT 'D-1'  , 'D'  , '은행관리', 'N' FROM dual
UNION ALL SELECT 'D-1-1', 'D-1', '계좌관리', 'Y' FROM dual
)
SELECT cd, up_cd, nm, yn
  FROM t m
 WHERE yn = 'Y'
   AND EXISTS (SELECT 1
                 FROM t s
                WHERE CONNECT_BY_ISLEAF = 1
                  AND yn = 'Y'
                START WITH cd = m.cd
                CONNECT BY PRIOR cd = up_cd
                       AND PRIOR yn = 'Y'
               )
 START WITH up_cd IS NULL
 CONNECT BY PRIOR cd = up_cd
        AND PRIOR yn = 'Y'
;

 


by 초봉 [2022.10.06 17:49:26]

감사합니다 ㅜㅜ

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