> 데이터 베이스 > MySQL 튜토리얼 > MAX() 및 CASE 문을 사용하여 MySQL 열 데이터를 행으로 피벗하는 방법은 무엇입니까?

MAX() 및 CASE 문을 사용하여 MySQL 열 데이터를 행으로 피벗하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-17 11:01:25
원래의
430명이 탐색했습니다.

How to Pivot MySQL Column Data into Rows Using MAX() and CASE Statements?

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

테이블의 열 데이터를 행으로 변환하는 것은 특히 다차원의 경우 어려운 작업일 수 있습니다. 데이터 세트. MySQL에서는 이 작업을 일반적으로 "피버팅"이라고 합니다.

문제:

제공된 데이터 세트는 세 개의 테이블로 구성됩니다.

  • 질문: 매장 질문 titles.
  • 결과: 특정 작업 ID에 대한 사용자 응답을 기록합니다.
  • 답변: 각 질문과 결과 조합에 대한 답변이 포함되어 있습니다.

질문 답변을 각 결과의 열로 표시하도록 데이터를 재구성하는 것이 목표입니다. set.

해결책:

이를 달성하려면 CASE 문과 함께 MAX() 집계 함수를 활용하는 MySQL 쿼리를 활용할 수 있습니다. 아래 쿼리는 효과적으로 열 데이터를 행으로 피벗합니다.

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
로그인 후 복사

설명:

  • 쿼리는 결과(a) 테이블에서 다양한 필드를 선택합니다. 결과 ID, 사용자 ID 및 작업 ID를 포함합니다.
  • 그런 다음 INNER JOIN을 사용하여 답변(b) 테이블.
  • 또 다른 INNER JOIN은 질문(c) 테이블에 연결되어 각 답변에 대한 실제 질문을 식별합니다.
  • MAX() 함수는 CASE 문 내에서 다음과 같이 적용됩니다. 각 결과와 질문 조합에 대한 답변을 집계합니다.
  • 마지막으로 결과를 결과 ID, 사용자 ID, 직무 ID별로 그룹화하여 원하는 행을 생성합니다. 구조.

이 쿼리는 다음과 같은 출력을 생성합니다.

result_id user_id job_id Is it this? Or this? Or that?
1 1 1 Yes No Maybe
2 1 3 Maybe No Maybe
3 2 3 Yes Yes No

동적 버전:

알 수 없는 질문 개수가 있는 경우 (예: 1000) 쿼리의 동적 버전이 더 적합합니다. 이는 동적 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 문을 동적으로 작성합니다. 그 결과, 다양한 질문을 처리할 수 있는 더욱 유연한 쿼리가 탄생했습니다.

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

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