집 >데이터 베이스 >MySQL 튜토리얼 >여러 기준에 따라 MySQL에서 행을 열로 동적으로 피벗하는 방법은 무엇입니까?
MySQL에서 여러 기준을 사용하여 행을 열로 동적으로 변환
질문:
어떻게 할 수 있나요? 두 가지 기준에 따라 MySQL에서 행을 열로 동적으로 변환합니다. 열?
컨텍스트:
테이블에는 각 행에 대해 "data" 및 "price"라는 이름의 열이 있는 여러 행이 포함되어 있습니다. 목표는 데이터와 가격의 고유한 조합을 나타내는 열과 해당 행 데이터를 포함하는 각 셀이 있는 새 테이블로 테이블을 변환하는 것입니다.
해결책:
여러 기준에 따라 행을 열로 동적으로 변환하기 위해 MySQL 기능과 동적 기능을 조합하여 사용할 수 있습니다. SQL.
먼저 원본 테이블의 피벗을 해제하여 각각의 고유한 데이터 조합에 대해 여러 행이 포함된 새 테이블을 생성합니다. 및 가격.
SELECT id, CONCAT('order', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT('item', item) AS col, price AS value FROM tableA;
다음으로 CASE 문을 사용하여 피벗되지 않은 데이터를 다시 열로 집계합니다.
SELECT id, MAX(CASE WHEN col = 'order1' THEN value END) AS order1, MAX(CASE WHEN col = 'order2' THEN value END) AS order2, MAX(CASE WHEN col = 'order3' THEN value END) AS order3, MAX(CASE WHEN col = 'item1' THEN value END) AS item1, MAX(CASE WHEN col = 'item2' THEN value END) AS item2, MAX(CASE WHEN col = 'item3' THEN value END) AS item3 FROM ( SELECT id, CONCAT('order', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT('item', item) AS col, price AS value FROM tableA ) d GROUP BY id;
쿼리를 동적으로 만들기 위해 준비된 문을 사용하고 원본 테이블의 고유 열을 기반으로 하는 CASE 문입니다.
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(CASE WHEN col = ''', col, ''' THEN value END) AS `', col, '`') ) INTO @sql FROM ( SELECT CONCAT('order', `order`) AS col FROM tableA UNION ALL SELECT CONCAT('item', `item`) AS col FROM tableA ) d; SET @sql = CONCAT('SELECT id, ', @sql, ' FROM ( SELECT id, CONCAT(''order'', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT(''item'', item) AS col, price AS value FROM tableA ) d GROUP BY id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
이 동적 쿼리는 임의 개수의 고유 기준을 처리하고 원하는 변환 테이블을 생성합니다.
위 내용은 여러 기준에 따라 MySQL에서 행을 열로 동적으로 피벗하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!