수색…


조건에 따라 동적 열 집합 해제

다음 예는 BI /보고를 위해 트랜잭션 데이터를 피벗 팅되지 않은 데이터로 변환하려고 할 때 매우 유용합니다. 피벗되지 않은 차원에 동적 열 집합이있을 수 있습니다.

예를 들어, 원시 데이터 테이블에는 표시된 질문 형태로 직원 평가 데이터가 포함되어 있다고 가정합니다.

원시 데이터 테이블은 다음과 같습니다.

create table rawdata

(
 PersonId VARCHAR(255)
,Question1Id INT(11)
,Question2Id INT(11)
,Question3Id INT(11)
)  

rawdata 테이블은 ETL 프로 시저의 일부로서 임시 테이블이며 다양한 수의 질문을 가질 수 있습니다. 목표는 임의의 수의 질문, 즉 피벗 해제 될 열에 대해 동일한 피벗 해제 프로 시저를 사용하는 것입니다.

다음은 rawdata 테이블의 장난감 예입니다.

여기에 이미지 설명을 입력하십시오.

MYSQL에서 데이터를 unpivot하는 잘 알려진 정적 인 방법은 UNION ALL을 사용하는 것입니다.

create table unpivoteddata

(

 PersonId VARCHAR(255)
,QuestionId VARCHAR(255)
,QuestionValue INT(11)

);

INSERT INTO unpivoteddata SELECT PersonId, 'Question1Id' col, Question1Id 
FROM rawdata
UNION ALL
SELECT PersonId, 'Question2Id' col, Question2Id 
FROM rawdata
UNION ALL
SELECT PersonId, 'Question3Id' col, Question3Id 
FROM rawdata; 

여기서는 임의의 수의 QuestionId 열을 unpivot 할 방법을 정의하고자합니다. 이를 위해서는 원하는 열을 동적으로 선택하는 준비된 명령문을 실행해야합니다. 어떤 열을 피벗 해제 할 것인지 선택할 수 있으려면 GROUP_CONCAT 문을 사용하고 데이터 형식이 'int'로 설정된 열을 선택합니다. GROUP_CONCAT에는 실행될 SELECT 문의 추가 요소가 모두 포함됩니다.

set @temp2 = null; 

SELECT GROUP_CONCAT(' SELECT ', 'PersonId',',','''',COLUMN_NAME,'''', ' col     ',',',COLUMN_NAME,' FROM rawdata' separator ' UNION ALL' ) FROM     INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'rawdata' AND DATA_TYPE = 'Int' INTO     @temp2;

select @temp2;

또 다른 경우에는 열 이름이 패턴과 일치하는 열을 선택할 수 있습니다. 예를 들어

DATA_TYPE = 'Int'

용도

COLUMN_NAME LIKE 'Question%'

또는 ETL 단계를 통해 제어 할 수있는 적합한 것입니다.

준비된 진술은 다음과 같이 마무리됩니다 :

set @temp3 = null;

select concat('INSERT INTO unpivoteddata',@temp2) INTO @temp3;

select @temp3;

prepare stmt FROM @temp3;
execute stmt;
deallocate prepare stmt;

unpivoteddata 테이블은 다음과 같습니다.

SELECT * FROM unpivoteddata

여기에 이미지 설명을 입력하십시오.

조건에 따라 열을 선택하고 준비된 문을 작성하면 데이터를 동적으로 피벗 해제하는 효율적인 방법입니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow