언피봇 기준은 하나밖에 못 하는 것인가요? 0 5 2,943

by 미야자키무야호 [DB 기타] 언피봇 [2021.06.17 17:01:22]


언피봇 기준을 날짜랑 체크 여부 두개로 보고싶은데

하나씩 밖에 못하는 것 같은데 또 딱히 안된다 라는 글은 못봐서 질문드립니다.

조인도 안되는것 같고,, 언피봇 다루기 어렵네요,,

by 마농 [2021.06.17 17:33:29]

추상적 표현의 질문 보다는.
구체적 자료를 제시해서 질문해 주시는게 좋습니다.
원본 대비 결과표 예시자료를 보여 주세요.


by 미야자키무야호 [2021.06.17 17:50:44]

너무 두서없었군요 죄송합니다!

 

언피봇 쿼리가

SELECT 컬럼명 

FROM 테이블명 

PIVOT([집계컬럼명] FOR [대상컬럼명] IN ([행으로 변경될 현재 열1, 행으로 변경될 현재 열2, ... ])) AS 피벗테이블명

으로 알고있습니다.

 

저는 대상컬럼명을 2개로 하고싶어요

발생 체크 여부에 Yes라고 해놓고 발생 날짜를 안쓴 사람들이 있어서 따로따로 테이블을 보는 것 보다 한꺼번에 체크하고 싶었습니다

select 회원넘버, 집계컬럼명, 대상컬럼명1(체크 여부), 대상컬럼명2(날짜)  하고싶은데 

가능할까요?

 

 


by 마농 [2021.06.17 17:55:52]

예시 데이터를 보여주세요. 원본 대비 결과표 형태로
DBMS 종류도 명시해 주세요.


by 미야자키무야호 [2021.06.22 15:07:40]

제가 사용하고 있는건 MSSQL 입니다

 

회원 립스틱구매 립스틱구매날짜 아이라이너구매 아이라이너구매날짜 파운데이션구매 파운데이션구매날짜 하이라이터구매 하이라이터구매날짜
A-123 Y 2021-03-23 Y   Y 2021-04-10 N  

이런 식으로 데이터가 있습니다.

구매에 Y로 체크는 해놓았는데 날짜는 없는 값이 많습니다.

 

그래서

회원 구매 체크 날짜
A-0123 립스틱구매 Y 2021-03-23
A-0123 아이라이너구매 Y  
A-0123 파운데이션구매 Y 2021-04-10
A-0123 하이라이터구매 N  

위 처럼 표현하고싶습니다. 

 

MSSQL로 언피봇을 쓰니까 컬럼이 회원/구매/체크 or 회원/구매/날짜 이렇게 언피봇 기준이 하나씩만 들어가더라구요.

회원, 구매, 체크와 날짜를 모두 볼 수 있을까요? 


by 마농 [2021.06.22 16:22:03]

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
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입