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 중국어 웹사이트의 기타 관련 기사를 참조하세요!