데이터가 이렇게 있습니다.
체크항목수는 고정이며, 사람1~5 리스트수는 변동 됩니다.
항목 | 체크1 | 체크2 | 체크3 | 체크4 | 체크5 | 특이사항 |
사람1 | O | X | O | O | O | |
사람2 | X | O | O | O | X | |
사람3 | O | O | X | X | O | 특이사항입니다. |
사람4 | O | X | O | O | O | |
사람5 | O | O | O | O | X |
이렇게 조회되게 변경 하고 싶습니다.
특이사항은 모든 사람들의 '비고' 컬럼 값이 있는값으로 보여줘야 합니다.
(비고는 사람수와 무관하게 한사람에게만 등록되거나 전체 사람에게 미등록됨)
항목 | 사람1 | 사람2 | 사람3 | 사람4 | 사람5 |
체크1 | O | X | O | O | O |
체크2 | X | O | O | X | O |
체크3 | O | O | X | O | O |
체크4 | O | O | X | O | O |
체크5 | O | X | O | O | X |
비고 | 특이사항입니다. |
가능할지 모르겠지만 고수님들 부탁 드립니다.
1. SQL 만으로는 가변적인 정보를 컬럼으로 구현할 수는 없습니다.
- 고정으로 개수와 값을 정확하게 알고 있어야 가능 합니다.
- 가변으로 하려면 동적쿼리 형태로 구현해야 합니다.
2. 엑셀과 같은 셀병합 기능은 없습니다.
WITH t AS ( SELECT '사람1' id, 'O' c1, 'X' c2, 'O' c3, 'O' c4, 'O' c5, '' bigo FROM dual UNION ALL SELECT '사람2', 'X', 'O', 'O', 'O', 'X', '' FROM dual UNION ALL SELECT '사람3', 'O', 'O', 'X', 'X', 'O', '특이사항입니다.' FROM dual UNION ALL SELECT '사람4', 'O', 'X', 'O', 'O', 'O', '' FROM dual UNION ALL SELECT '사람5', 'O', 'O', 'O', 'O', 'X', '' FROM dual ) SELECT * FROM t UNPIVOT (c FOR gb IN ( c1 AS '체크1' , c2 AS '체크2' , c3 AS '체크3' , c4 AS '체크4' , c5 AS '체크5' , bigo AS '비고' ) ) PIVOT (MIN(c) FOR id IN ( '사람1' 사람1 , '사람2' 사람2 , '사람3' 사람3 , '사람4' 사람4 , '사람5' 사람5 -- , '사람6' 사람6 ) ) ORDER BY NULLIF(gb, '비고') ;