제가 사용하고 있는건 MSSQL 입니다
|
이런 식으로 데이터가 있습니다.
구매에 Y로 체크는 해놓았는데 날짜는 없는 값이 많습니다.
그래서
회원 | 구매 | 체크 | 날짜 |
A-0123 | 립스틱구매 | Y | 2021-03-23 |
A-0123 | 아이라이너구매 | Y | |
A-0123 | 파운데이션구매 | Y | 2021-04-10 |
A-0123 | 하이라이터구매 | N |
위 처럼 표현하고싶습니다.
MSSQL로 언피봇을 쓰니까 컬럼이 회원/구매/체크 or 회원/구매/날짜 이렇게 언피봇 기준이 하나씩만 들어가더라구요.
회원, 구매, 체크와 날짜를 모두 볼 수 있을까요?
Oracle 의 경우 여러 컬럼을 묶어서 언피봇 처리가 가능한데.
MSSQL 은 불가능 한 듯 하네요.
-- Oracle -- WITH t AS ( SELECT 'A-123' id , 'Y' ck1, '2021-03-23' dt1 , 'Y' ck2, null dt2 , 'Y' ck3, '2021-04-10' dt3 , 'N' ck4, null dt4 FROM dual ) SELECT * FROM t UNPIVOT ((체크, 일자) FOR 구매 IN ( (ck1, dt1) AS '립스틱' , (ck2, dt2) AS '아이라이너' , (ck3, dt3) AS '파운데이션' , (ck4, dt4) AS '하이라이터' ) ) ;
-- MSSQL -- WITH t AS ( SELECT 'A-123' id , 'Y' ck1, '2021-03-23' dt1 , 'Y' ck2, null dt2 , 'Y' ck3, '2021-04-10' dt3 , 'N' ck4, null dt4 ) SELECT id , 구매 , SUBSTRING(v, 1, 1) 체크 , SUBSTRING(v, 2, 10) 일자 FROM (SELECT id , CAST(CONCAT(ck1, dt1) AS VARCHAR(11)) 립스틱 , CAST(CONCAT(ck2, dt2) AS VARCHAR(11)) 아이라이너 , CAST(CONCAT(ck3, dt3) AS VARCHAR(11)) 파운데이션 , CAST(CONCAT(ck4, dt4) AS VARCHAR(11)) 하이라이터 FROM t ) a UNPIVOT (v FOR 구매 IN (립스틱, 아이라이너, 파운데이션, 하이라이터)) a ;
-- MSSQL -- WITH t AS ( SELECT 'A-123' id , 'Y' ck1, '2021-03-23' dt1 , 'Y' ck2, null dt2 , 'Y' ck3, '2021-04-10' dt3 , 'N' ck4, null dt4 ) SELECT id , 구분 , CASE lv WHEN 1 THEN ck1 WHEN 2 THEN ck2 WHEN 3 THEN ck3 WHEN 4 THEN ck4 END 체크 , CASE lv WHEN 1 THEN dt1 WHEN 2 THEN dt2 WHEN 3 THEN dt3 WHEN 4 THEN dt4 END 일자 FROM t a CROSS JOIN (SELECT 1 lv, '립스틱' 구분 UNION ALL SELECT 2, '아이라이너' UNION ALL SELECT 3, '파운데이션' UNION ALL SELECT 4, '하이라이터' ) b ;