select a1.code_value AS depth1 , a2.code_value AS depth2 , a3.code_value AS depth3 from code_tb AS a1 left outer join code_tb AS a2 ON a1.code_key = a2.code_parent left outer join code_tb AS a3 ON a2.code_key = a3.code_parent where a1.code_parent is null 다중 카테고리에서 위 쿼리를 실행하면 code_parent값이 없을 때 1차 카테고리만 출력이 되고, code_parent값이 code_key값과 같으면 하위 카테고리로 등록이 되어서 무한 다중 카테기로가 되도록 DB를 구성했습니다.
문제는.. 위 쿼리를 실행하면 아래와 같이 출력이 됩니다.
A A-1 A-1-1
A A-1 A-1-2
A A-1 A-1-3
A A-1 A-1-4
B B-1 B-1-1
B B-1 B-1-2
B B-1 B-1-3
저는
A A-1 A-1-1
A-1-2
A-1-3
A-1-4
A A-2 A-2-1
B B-1 B-1-1
B-1-2
B-1-3
이런식으로 출력이 되게 하고 싶은데 잘 방법이 생각이 나질 않네요..ㅠㅠ
1차만 여러개 있을때는 그 여러개가 다 출력이 되고,
2차가 있을때는 1차에 중복된 값들은 한 번만 출력되게 하고싶고, 3차도 마찬가지로 1,2차가 같은 것들은 한번씩만 출력되게 하고 싶습니다.
그리고 또 하나 궁금한것이...
각 카테고리별로 1,2,3차 안에 등록되어있는 카테고리의 카운트를 구할려면 어떻게 해야할까요:??
WITH code_tb AS ( SELECT 1 code_key, 'A' code_value, null code_parent UNION ALL SELECT 2, 'B' , null UNION ALL SELECT 3, 'A-1' , 1 UNION ALL SELECT 4, 'A-2' , 1 UNION ALL SELECT 5, 'B-1' , 2 UNION ALL SELECT 6, 'A-1-1', 3 UNION ALL SELECT 7, 'A-1-2', 3 UNION ALL SELECT 8, 'A-1-3', 3 UNION ALL SELECT 9, 'A-1-4', 3 UNION ALL SELECT 10, 'A-2-1', 4 UNION ALL SELECT 11, 'B-1-1', 5 UNION ALL SELECT 12, 'B-1-2', 5 UNION ALL SELECT 13, 'B-1-3', 5 ) SELECT CASE rn1 WHEN 1 THEN depth1 END depth1 , CASE rn2 WHEN 1 THEN depth2 END depth2 , depth3 , COUNT(CASE rn1 WHEN 1 THEN 1 END) OVER() cnt1 , COUNT(CASE rn2 WHEN 1 THEN 1 END) OVER() cnt2 , COUNT(*) OVER() cnt_3 , COUNT(CASE rn2 WHEN 1 THEN 1 END) OVER(PARTITION BY cd1) cnt1_2 , COUNT(*) OVER(PARTITION BY cd1) cnt1_3 , COUNT(*) OVER(PARTITION BY cd1, cd2) cnt2_3 FROM (SELECT a1.code_key cd1 , a2.code_key cd2 , a3.code_key cd3 , a1.code_value depth1 , a2.code_value depth2 , a3.code_value depth3 , ROW_NUMBER() OVER(PARTITION BY a1.code_key ORDER BY a2.code_key, a3.code_key) rn1 , ROW_NUMBER() OVER(PARTITION BY a1.code_key, a2.code_key ORDER BY a3.code_key) rn2 FROM code_tb a1 LEFT OUTER JOIN code_tb a2 ON a1.code_key = a2.code_parent LEFT OUTER JOIN code_tb a3 ON a2.code_key = a3.code_parent WHERE a1.code_parent IS NULL ) a ;