집 >데이터 베이스 >MySQL 튜토리얼 >보고를 위해 MySQL에서 열을 행으로 피벗하는 방법은 무엇입니까?
MySQL 피벗: 열을 행으로 변환
MySQL과 같은 관계형 데이터베이스에서는 보고 목적으로 데이터를 변환해야 하는 경우가 많습니다. 이러한 변환 중 하나에는 열을 행으로 변환하는 과정("피벗"이라고 함)이 포함됩니다. 이 기술을 사용하면 보다 유연하고 간결한 데이터 표현이 가능합니다.
질문:
다음 MySQL 테이블을 고려해보세요.
<code class="language-sql">CREATE TABLE mytable ( id INT, month VARCHAR(3), col1 VARCHAR(1), col2 VARCHAR(1), col3 VARCHAR(1), col4 VARCHAR(1) ); INSERT INTO mytable (id, month, col1, col2, col3, col4) VALUES (101, 'Jan', 'A', 'B', NULL, 'B'), (102, 'Feb', 'C', 'A', 'G', 'E');</code>
col1부터 col4까지의 값을 행으로, 1월과 2월을 열로 표시하는 보고서를 만드는 것이 목표입니다.
해결책:
MySQL은 데이터 피벗 해제 또는 피벗을 위한 내장 기능을 제공하지 않습니다. 그러나 UNION ALL을 사용하여 이러한 작업을 시뮬레이션하고 CASE 표현식으로 집계할 수 있습니다.
1. 반관점:
데이터 피벗을 해제하기 위해 UNION ALL을 사용하여 모든 열의 행을 단일 열로 결합하는 새 하위 쿼리를 만듭니다.
<code class="language-sql">SELECT id, month, col1 AS `value`, 'col1' AS `descrip` UNION ALL SELECT id, month, col2 AS `value`, 'col2' AS `descrip` UNION ALL SELECT id, month, col3 AS `value`, 'col3' AS `descrip` UNION ALL SELECT id, month, col4 AS `value`, 'col4' AS `descrip` FROM mytable;</code>
2. 관점:
다음으로 unpivot 쿼리를 하위 쿼리로 래핑하고 집계 및 CASE 문을 사용하여 데이터를 필요한 형식으로 변환합니다.
<code class="language-sql">SELECT descrip, MAX(CASE WHEN month = 'Jan' THEN `value` ELSE NULL END) AS Jan, MAX(CASE WHEN month = 'Feb' THEN `value` ELSE NULL END) AS Feb FROM ( SELECT id, month, `value`, descrip FROM ( SELECT id, month, col1 AS `value`, 'col1' AS `descrip` UNION ALL SELECT id, month, col2 AS `value`, 'col2' AS `descrip` UNION ALL SELECT id, month, col3 AS `value`, 'col3' AS `descrip` UNION ALL SELECT id, month, col4 AS `value`, 'col4' AS `descrip` FROM mytable ) AS unpivoted ) AS src GROUP BY descrip;</code>
결과:
Descrip | Jan | Feb |
---|---|---|
col1 | A | C |
col2 | B | A |
col3 | NULL | G |
col4 | B | E |
참고: ELSE 0 END
을 ELSE NULL END
으로 변경하면 결과가 데이터베이스 사양과 더 일관되게 만들고 불필요한 0 값을 피할 수 있습니다.
위 내용은 보고를 위해 MySQL에서 열을 행으로 피벗하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!