본문 바로가기
MySql

MySQL의 피벗 테이블-varchar 형식의 값이있는 피벗 테이블로 변환

by 베이스 공부 2020. 12. 23.
반응형

Pivot_table의 데이터에 대한 첫 번째 그림에서 볼 수 있듯이 Table1의 데이터를 변환하고 싶습니다. MySQL에서 가능합니까? 피벗 테이블 (A, B, C, D)의 값은 varchar 데이터 형식이므로 SUM 등 MySQL의 집계 함수를 사용할 수 없습니다.

Table1:
PK        Name     Subject     Grade
-------------------------------------
1         Bob       Math        A
2         Bob       History     B
3         Bob       Language    C
4         Bob       Biology     D
5         Sue       History     C
6         Sue       Math        A
7         Sue       Music       A
8         Sue       Geography   C


Pivot_table:
Subject     Bob     Sue
-------------------------
Math        A        A
History     B        C
Language    C 
Biology     D
Music                A
Geography            C

당신의 도움을 주셔서 감사합니다

 

해결 방법

 

정적 쿼리 (Bob 및 Sue에 관한 한)는 다음과 같을 수 있습니다.

SELECT subject, 
       MAX(CASE WHEN name = 'Bob' THEN grade END) `Bob`,
       MAX(CASE WHEN name = 'Sue' THEN grade END) `Sue` 
  FROM table1 
 GROUP BY subject

이제 다른 이름을 설명 할 수 있도록 다음과 같은 동적 SQL을 사용합니다.

SET @sql = NULL;

SELECT GROUP_CONCAT(DISTINCT
         CONCAT('MAX(CASE WHEN name = ''', name,
                ''' THEN grade END) `', name, '`'))
  INTO @sql
  FROM table1;

SET @sql = CONCAT('SELECT subject, ', @sql, ' 
                     FROM table1 
                    GROUP BY subject');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

산출:


호출 측에서 작업을 단순화하기 위해 저장 프로 시저로 래핑 할 수 있습니다.

DELIMITER $$
CREATE PROCEDURE sp_grade_report()
BEGIN
  SET @sql = NULL;

  SELECT GROUP_CONCAT(DISTINCT
           CONCAT('MAX(CASE WHEN name = ''', name,
                  ''' THEN grade END) `', name, '`'))
    INTO @sql
    FROM table1;

  SET @sql = CONCAT('SELECT subject, ', @sql, ' 
                       FROM table1 
                      GROUP BY subject');

  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

샘플 사용법 :

CALL sp_grade_report();


 

참조 페이지 https://stackoverflow.com/questions/18629155

 

 

반응형

댓글