postgresql left join에서 중복된 값을 제거해서 출력을 하고 싶습니다. 0 1 623

by 구루비 [SQL Query] [2020.12.15 00:38:11]


 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차 안에 등록되어있는 카테고리의 카운트를 구할려면 어떻게 해야할까요:??

by 마농 [2020.12.15 09:07:59]
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
;

 

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