아래와 같이 데이터가 있는 테이블이 있습니다.
item_sub_category
sub_category_cd |
category_cd |
name |
14 | 2 | TV |
15 | 2 | 냉장고 |
item_options
option_cd |
sub_category_cd |
name |
22 | 14 | 사이즈 |
23 | 14 | 종류 |
item_option_detail
option_detail_cd |
option_cd |
name |
76 | 22 | 30미만 |
77 | 22 | 40미만 |
78 | 22 | 50미만 |
79 | 22 | 60미만 |
80 | 22 | 70미만 |
81 | 23 | 스탠드형 |
82 | 23 | 벽걸이형 |
제가 원하는 결과는 아래와 같은 결과를 얻고 싶습니다.
name | detail_name |
30미만 | 스탠드형 |
30미만 | 벽걸이형 |
40미만 | 스탠드형 |
40미만 | 벽걸이형 |
50미만 | 스탠드형 |
50미만 | 벽걸이형 |
60미만 | 스탠드형 |
60미만 | 벽걸이형 |
70미만 | 스탠드형 |
70미만 | 벽걸이형 |
이게 가능 할까요?
도움 부탁드립니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | WITH RECURSIVE t AS ( WITH item_sub_category(sub_category_cd, category_cd, name ) AS ( SELECT 14 sub_category_cd, 2 category_cd, 'TV' name UNION ALL SELECT 15, 2, '냉장고' ) , tem_options AS ( SELECT 22 option_cd, 14 sub_category_cd, '사이즈' name UNION ALL SELECT 23, 14, '종류' UNION ALL SELECT 24, 15, '색상' UNION ALL SELECT 25, 15, '종류' UNION ALL SELECT 26, 15, '크기' ) , item_option_detail AS ( SELECT 76 option_detail_cd, 22 option_cd, '30미만' name UNION ALL SELECT 77, 22, '40미만' UNION ALL SELECT 78, 22, '50미만' UNION ALL SELECT 79, 22, '60미만' UNION ALL SELECT 80, 22, '70미만' UNION ALL SELECT 81, 23, '스탠드형' UNION ALL SELECT 82, 23, '벽걸이형' UNION ALL SELECT 83, 24, '빨강' UNION ALL SELECT 84, 24, '파랑' UNION ALL SELECT 85, 25, '양문형' UNION ALL SELECT 86, 25, '단문형' UNION ALL SELECT 87, 26, '대' UNION ALL SELECT 88, 26, '중' UNION ALL SELECT 89, 26, '소' ) , tmp AS ( SELECT a.category_cd , a.sub_category_cd , a. name sub_category_nm , c.option_cd , b. name option_nm , c.option_detail_cd , c. name , MAX (c.option_cd) OVER(PARTITION BY a.category_cd, a.sub_category_cd) last_option_cd , DENSE_RANK() OVER(PARTITION BY a.category_cd, a.sub_category_cd ORDER BY c.option_cd) dr FROM item_sub_category a INNER JOIN tem_options b ON a.sub_category_cd = b.sub_category_cd INNER JOIN item_option_detail c ON b.option_cd = c.option_cd -- WHERE a.category_cd = 2 -- AND a.sub_category_cd = 14 ) SELECT category_cd , sub_category_cd , sub_category_nm , last_option_cd , dr , option_cd , option_detail_cd , name , CAST (option_detail_cd AS VARCHAR (200)) cds , CAST ( name AS VARCHAR (200)) names FROM tmp WHERE dr = 1 UNION ALL SELECT a.category_cd , a.sub_category_cd , a.sub_category_nm , a.last_option_cd , b.dr , b.option_cd , b.option_detail_cd , b. name , CONCAT(a.cds, ' - ' , b.option_detail_cd) cds , CONCAT(a.names, ' - ' , b. name ) names FROM t a INNER JOIN tmp b ON a.category_cd = b.category_cd AND a.sub_category_cd = b.sub_category_cd AND b.dr = a.dr + 1 ) SELECT sub_category_cd , sub_category_nm , names FROM t WHERE option_cd = last_option_cd ORDER BY category_cd, sub_category_cd, cds ; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | /* -- Test 용 -- WITH item_sub_category(sub_category_cd, category_cd, name ) AS ( SELECT 14 sub_category_cd, 2 category_cd, 'TV' name UNION ALL SELECT 15, 2, '냉장고' ) , tem_options AS ( SELECT 22 option_cd, 14 sub_category_cd, '사이즈' name UNION ALL SELECT 23, 14, '종류' UNION ALL SELECT 24, 15, '색상' UNION ALL SELECT 25, 15, '종류' ) , item_option_detail AS ( SELECT 76 option_detail_cd, 22 option_cd, '30미만' name UNION ALL SELECT 77, 22, '40미만' UNION ALL SELECT 78, 22, '50미만' UNION ALL SELECT 79, 22, '60미만' UNION ALL SELECT 80, 22, '70미만' UNION ALL SELECT 81, 23, '스탠드형' UNION ALL SELECT 82, 23, '벽걸이형' UNION ALL SELECT 83, 24, '빨강' UNION ALL SELECT 84, 24, '파랑' UNION ALL SELECT 85, 25, '양문형' UNION ALL SELECT 86, 25, '단문형' ) */ SELECT a. name , b. name name_1 , c. name name_2 FROM ( SELECT a. name , MIN (b.option_cd) option_cd_1 , MAX (b.option_cd) option_cd_2 FROM item_sub_category a INNER JOIN tem_options b ON a.sub_category_cd = b.sub_category_cd WHERE a.sub_category_cd = 14 -- TV -- WHERE a.sub_category_cd = 15 -- 냉장고 GROUP BY a. name ) a INNER JOIN item_option_detail b ON a.option_cd_1 = b.option_cd INNER JOIN item_option_detail c ON a.option_cd_2 = c.option_cd ORDER BY b.option_detail_cd, c.option_detail_cd ; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | WITH item_sub_category(sub_category_cd, category_cd, name ) AS ( SELECT 14 sub_category_cd, 2 category_cd, 'TV' name UNION ALL SELECT 15, 2, '냉장고' ) , tem_options AS ( SELECT 22 option_cd, 14 sub_category_cd, '사이즈' name UNION ALL SELECT 23, 14, '종류' UNION ALL SELECT 24, 15, '색상' -- UNION ALL SELECT 25, 15, '종류' ) , item_option_detail AS ( SELECT 76 option_detail_cd, 22 option_cd, '30미만' name UNION ALL SELECT 77, 22, '40미만' UNION ALL SELECT 78, 22, '50미만' UNION ALL SELECT 79, 22, '60미만' UNION ALL SELECT 80, 22, '70미만' UNION ALL SELECT 81, 23, '스탠드형' UNION ALL SELECT 82, 23, '벽걸이형' UNION ALL SELECT 83, 24, '빨강' UNION ALL SELECT 84, 24, '파랑' -- UNION ALL SELECT 85, 25, '양문형' -- UNION ALL SELECT 86, 25, '단문형' ) SELECT a. name , b. name name_1 , c. name name_2 FROM ( SELECT a. name , MIN (b.option_cd) option_cd_1 , NULLIF ( MAX (b.option_cd), MIN (b.option_cd)) option_cd_2 -- 요기 FROM item_sub_category a INNER JOIN tem_options b ON a.sub_category_cd = b.sub_category_cd -- WHERE a.sub_category_cd = 14 -- TV WHERE a.sub_category_cd = 15 -- 냉장고 GROUP BY a. name ) a INNER JOIN item_option_detail b ON a.option_cd_1 = b.option_cd LEFT JOIN item_option_detail c ON a.option_cd_2 = c.option_cd -- 요기 ORDER BY b.option_detail_cd, c.option_detail_cd ; |