>데이터 베이스 >MySQL 튜토리얼 >보고를 위해 MySQL에서 열을 행으로 피벗하는 방법은 무엇입니까?

보고를 위해 MySQL에서 열을 행으로 피벗하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-09 14:57:41803검색

How to Pivot Columns into Rows in MySQL for Reporting?

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 ENDELSE NULL END으로 변경하면 결과가 데이터베이스 사양과 더 일관되게 만들고 불필요한 0 값을 피할 수 있습니다.

위 내용은 보고를 위해 MySQL에서 열을 행으로 피벗하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.