NO |
NAME | DEPT | M_NO | M_NO | YEAR | |
1 | 홍길동1 | 부서1 | 1, 2, 3 | 1 | 2014 | |
2 | 홍길동2 | 부서2 | 1 | 2 | 2015 | |
3 | 홍길동3 | 부서3 | 3, 5 | 3 | 2016 | |
4 | 홍길동4 | 부서4 | 2 | 4 | 2017 | |
5 | 2018 |
TABLE SUBTABLE
현재 데이터가 들어있는 테이블 형태 입니다.
SELECT 를 해올때 TABLE과 SUBTABLE 테이블에 있는 M_NO데이터를 활용해서 SUBTABLE에 매칭되는 년도 데이터를 가져오고 싶은데
현재 서브쿼리를 사용하니 M_NO이 한개인 데이터는 연도데이터를 가져오는데
M_NO데이터가 여러개인 데이터는 NULL값을 가져오는데
현재 사용중인 쿼리 형태입니다.
SELECT NO, NAME, DEPT, M_NO,
(SELECT YEAR FROM SUBTABLE WHERE M_NO LIKE REPLACE(RTRIM(AA.M_NO,','),',,',',')) AS YEAR
FROM TABLE AA;
아래 테이블과 같이 데이터를 가져오고 싶은데 어떤식으로 가져오면 될까요?
NO | NAME | DEPT | M_NO | YEAR |
1 | 홍길동1 | 부서1 | 1, 2, 3 | 2014, 2015, 2016 |
2 | 홍길동2 | 부서2 | 1 | 2014 |
3 | 홍길동3 | 부서3 | 3, 5 | 2016, 2018 |
4 | 홍길동4 | 부서4 | 2 | 2015 |
WITH t(no,name,dept,m_no) AS ( SELECT 1,'홍길동1','부서1', '1,2,3' FROM DUAL UNION ALL SELECT 2,'홍길동2','부서2', '1' FROM DUAL UNION ALL SELECT 3,'홍길동3','부서3', '3,5' FROM DUAL UNION ALL SELECT 4,'홍길동4','부서4', '2' FROM DUAL ), t1(m_no,year) AS ( SELECT '1', '2014' FROM DUAL UNION ALL SELECT '2', '2015' FROM DUAL UNION ALL SELECT '3', '2016' FROM DUAL UNION ALL SELECT '4', '2017' FROM DUAL UNION ALL SELECT '5', '2018' FROM DUAL ) -- 마농님의 댓글로 작성해 봤습니다. -- 1번째 방법 SELECT a.no , a.name , a.dept , LISTAGG(b.year,',') WITHIN GROUP(ORDER BY INSTR(','||a.m_no||',',','||b.m_no||',')) FROM t a, t1 b WHERE INSTR(','||a.m_no||',',','||b.m_no||',') > 0 GROUP BY a.no,a.name,a.dept -- 2번째 방법 SELECT no , name , dept , (SELECT TO_CHAR(WM_CONCAT(year)) FROM t1 a WHERE REGEXP_LIKE(b.m_no,a.m_no)) FROM t b
감사합니다. 알려주신방법으로 해결을 했습니다.
알려주신방법으로 해결한 후 년도별로 데이터가
2013,2014,2015,2016,2017,2019 이런식으로 컬럼 한개에 값이 모여서 나오게 됬는데
해당 년도별로 컬럼을 따로 나누어서 년도별로 값이 있으면 해당 컬럼으로
년도값을 넣어주고 싶은데...방법이있을까요?
NO |
NAME | DEPT | M_NO | YEAR | Y_2013 | Y_2014 | Y_2015 | Y_2016 |
1 | 홍길동1 | 부서1 | 1, 2, 3 | 2014, 2015, 2016 | 2014 | 2015 | 2016 | |
2 | 홍길동2 | 부서2 | 1 | 2014 | 2014 | |||
3 | 홍길동3 | 부서3 | 3, 5 | 2016, 2018 | 2016 | |||
4 | 홍길동4 | 부서4 | 2 | 2015 | 2015 |