> 데이터 베이스 > MySQL 튜토리얼 > MySQL 테이블 열 데이터를 행으로 피벗하는 방법은 무엇입니까?

MySQL 테이블 열 데이터를 행으로 피벗하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-25 19:37:10
원래의
962명이 탐색했습니다.

How to Pivot MySQL Table Column Data into Rows?

MySQL 피벗 테이블 열 데이터를 행으로

MySQL에서 테이블 열 데이터를 행으로 피벗하려면 MAX( ) 및 CASE 함수와 GROUP BY 절이 함께 사용됩니다. 일반 구문은 다음과 같습니다.

SELECT
  GROUP_BY_COLUMNS,
  MAX(CASE WHEN condition1 THEN column1 END) AS column1_alias,
  MAX(CASE WHEN condition2 THEN column2 END) AS column2_alias,
  ...
FROM TABLE
GROUP BY GROUP_BY_COLUMNS
로그인 후 복사

제공된 예에는 세 개의 테이블이 있습니다. 설문지 질문이 포함된 질문; 사용자를 작업에 연결하는 결과 및 질문에 대한 사용자 응답이 포함된 답변.

질문 답변을 각 결과 집합의 열로 피벗하려면 다음 쿼리를 사용할 수 있습니다.

SELECT  a.ID,
        a.user_ID,
        a.job_id,
        MAX(CASE WHEN c.question = 'Is it this?' THEN b.answer END) 'Is it this?',
        MAX(CASE WHEN c.question = 'Or this?' THEN b.answer END) 'Or this?',
        MAX(CASE WHEN c.question = 'Or that? ' THEN b.answer END) 'Or that? '
FROM    Results a
        INNER JOIN Answers b
            ON a.id = b.fk_result_id
        INNER JOIN Question c
            ON b.fk_question_id = c.ID
GROUP   BY a.ID,
        a.user_ID,
        a.job_id
로그인 후 복사

이 쿼리는 fk_question_id 필드를 기반으로 하는 질문 테이블과 fk_result_id 필드를 기반으로 하는 결과 테이블이 있는 답변 테이블입니다. 그런 다음 결과를 ID, user_ID, job_id 열별로 그룹화하고 각 그룹에 대해 MAX() 함수와 CASE 문을 사용하여 각 질문에 대한 최대 답변을 계산합니다.

또는 다음과 같은 경우 질문 개수를 알 수 없는 경우 사용 가능한 질문을 기반으로 쿼리 문자열을 구성하는 동적 SQL 쿼리를 사용할 수 있습니다.

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN c.question = ''',
      question,
      ''' then b.answer end) AS ',
      CONCAT('`',question,'`')
    )
  ) INTO @sql
FROM Question;

SET @sql = CONCAT('SELECT  a.ID,
                            a.user_ID,
                            a.job_id, ', @sql, ' 
                    FROM    Results a
                            INNER JOIN Answers b
                                ON a.id = b.fk_result_id
                            INNER JOIN Question c
                                ON b.fk_question_id = c.ID
                    GROUP   BY a.ID,
                            a.user_ID,
                            a.job_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
로그인 후 복사

동적 쿼리는 @sql을 구성합니다. 각 질문에 필요한 열을 변수에 추가하여 준비된 명령문으로 실행합니다.

이러한 쿼리는 질문 답변을 각 결과 집합의 열로 반환하므로 사용자에게 친숙한 형식으로 표시할 수 있습니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿