집 >데이터 베이스 >MySQL 튜토리얼 >여러 열을 기반으로 MySQL에서 행을 열로 동적으로 변환하는 방법은 무엇입니까?
MySQL의 여러 열을 기반으로 행을 열로 동적 변환
이전 질문에서는 MySQL 쿼리를 사용하여 행을 동적으로 변환했습니다. 단일 열의 열에. 이제 "data"와 "price"라는 두 열에 대해 동일한 결과를 달성하는 것을 목표로 합니다.
문제:
다음 표의 데이터를 열로 변환합니다. "order1", "order2", "order3", "item1", "item2", "item3" 및 "item4"라는 이름이 지정되었습니다. "주문" 및 "항목" 열.
id | order | data | item | Price |
---|---|---|---|---|
1 | 1 | P | 1 | 50 |
1 | 1 | P | 2 | 60 |
1 | 1 | P | 3 | 70 |
1 | 2 | Q | 1 | 50 |
1 | 2 | Q | 2 | 60 |
1 | 2 | Q | 3 | 70 |
2 | 1 | P | 1 | 50 |
2 | 1 | P | 2 | 60 |
2 | 1 | P | 4 | 80 |
2 | 3 | S | 1 | 50 |
2 | 3 | S | 2 | 60 |
2 | 3 | S | 4 | 80 |
원하는 결과:
id | order1 | order2 | order3 | item1 | item2 | item3 | item4 |
---|---|---|---|---|---|---|---|
1 | P | Q | 50 | 60 | 70 | ||
2 | P | S | 50 | 60 | 80 |
해결책:
"주문" 및 "항목" 값의 수가 다음과 같은 경우 하드 코딩된 쿼리를 사용할 수 있습니다. 알려져 있지만 일반적인 경우에는 보다 동적인 솔루션이 필요합니다.
데이터 피벗 해제:
MySQL에는 피벗 해제 기능이 없지만 UNION ALL을 사용하여 변환할 수 있습니다. 여러 데이터 쌍을 행으로 변환:
select id, concat('order', `order`) col, data value from tableA union all select id, concat('item', item) col, price value from tableA;
값을 다시 열:
CASE:
select id, max(case when col = 'order1' then value end) order1, max(case when col = 'order2' then value end) order2, max(case when col = 'order3' then value end) order3, max(case when col = 'item1' then value end) item1, max(case when col = 'item2' then value end) item2, max(case when col = 'item3' then value end) item3 from ( select id, concat('order', `order`) col, data value from tableA union all select id, concat('item', item) col, price value from tableA ) d group by id;
동적 준비 문:
이 포함된 집계 함수를 사용하여 피벗되지 않은 데이터를 다시 열로 변환할 수 있습니다.마지막으로 집합 기반 연결 및 실행:
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`) col from tableA union all select concat('item', `item`) col from tableA )d; SET @sql = CONCAT('SELECT id, ', @sql, ' from ( select id, concat(''order'', `order`) col, data value from tableA union all select id, concat(''item'', item) col, price value from tableA ) d group by id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
이 접근 방식은 MySQL의 여러 기준에 따라 행을 열로 변환하는 유연하고 동적인 방법을 제공합니다.
위 내용은 여러 열을 기반으로 MySQL에서 행을 열로 동적으로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!