아래와 같이 데이터가 있는 테이블이 있습니다.
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미만 | 벽걸이형 |
이게 가능 할까요?
도움 부탁드립니다.
조합 가능한 사이즈와 종류를 모두 출력하는 거네요.
그런데. 옵션이 추가되면 어떻게 하나요? 색상이 추가되면 항목이 3개가 될텐데요?
쿼리에서 조회 컬럼의 개수가 가변으로 늘어나지는 않습니다.
1. 버전 알려주세요.
2. 조회 조건 있나요?
- 전체 검색인지? TV 만 검색인지?
네 버전은 5.7.19-log 입니다.
그리고 TV만 검색입니다!!! 냉장고만 검색도 하구요
감사합니다. 마농님 현재 옵션 항목은 최대 2개로만 제한 하였습니다.
그리고 알려주신거 돌려보는데 오류가나서 찾고 있는데 어렵네요 ㅠㅠ
아래와 같은 오류가 납니다...ㅠㅠ
[42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'RECURSIVE t AS ( WITH item_sub_categor' at line 1
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
;
/* -- 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
;
정말 감사합니다. 마농님~!!!!
제가 테스트로 돌려 보았는데요. 옵션이 한개일 수도 있어서요......
옵션 두개일때는 제가 원하던 결과 입니다!
냉장고의 아래와 같이 옵션 한개면 어떻게 해야하나요........정말 죄송합니다 ㅠㅠ
, tem_options AS
(
SELECT 22 option_cd, 14 sub_category_cd, '사이즈' name
UNION ALL SELECT 23, 14, '종류'
UNION ALL SELECT 25, 15, '종류'
)
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
;
정말 감사합니다~!
그저 빛!!!!!!!