다음 세 개의 MySQL 테이블이 있다고 가정합니다.
제품:
<code> id | name 1 | 产品A 2 | 产品B</code>
파트너:
<code> id | name 1 | 合作伙伴A 2 | 合作伙伴B</code>
판매량:
<code> partners_id | products_id 1 2 2 5 1 5 1 3 1 4 1 5 2 2 2 4 2 3 1 1</code>
목표는 판매 테이블의 행 데이터를 열 이름이 다양한 제품을 나타내는 동적 열로 변환하는 것입니다. 예상 출력은 다음과 같습니다.
<code>partner_name | 产品A | 产品B | 产品C | 产品D | 产品E 合作伙伴A 1 1 1 1 2 合作伙伴B 0 1 1 1 1</code>
안타깝게도 MySQL에는 전용 PIVOT 기능이 없습니다. 그러나 집계 함수와 CASE 문을 결합하여 비슷한 결과를 얻을 수 있습니다.
<code class="language-sql">SELECT pt.partner_name, COUNT(CASE WHEN pd.product_name = '产品A' THEN 1 END) AS 产品A, COUNT(CASE WHEN pd.product_name = '产品B' THEN 1 END) AS 产品B, COUNT(CASE WHEN pd.product_name = '产品C' THEN 1 END) AS 产品C, COUNT(CASE WHEN pd.product_name = '产品D' THEN 1 END) AS 产品D, COUNT(CASE WHEN pd.product_name = '产品E' THEN 1 END) AS 产品E FROM partners pt LEFT JOIN sales s ON pt.part_id = s.partner_id LEFT JOIN products pd ON s.product_id = pd.prod_id GROUP BY pt.partner_name</code>
알 수 없는 수의 제품을 처리하려면 동적 열 변환을 사용해야 합니다. 이를 위해서는 제품 테이블의 정보를 사용하여 런타임 시 SQL 문을 준비해야 합니다.
<code class="language-sql">SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'COUNT(CASE WHEN Product_Name = ''', Product_Name, ''' THEN 1 END) AS ', REPLACE(Product_Name, ' ', '') ) ) INTO @sql FROM products; SET @sql = CONCAT('SELECT pt.partner_name, ', @sql, ' FROM partners pt LEFT JOIN sales s ON pt.part_id = s.partner_id LEFT JOIN products pd ON s.product_id = pd.prod_id GROUP BY pt.partner_name'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;</code>
이 접근 방식을 사용하면 제품 열 수에 관계없이 처리할 수 있으며 SQL 문 자체를 수정하지 않고도 쿼리가 제품 테이블의 변경 사항에 적응할 수 있습니다.
위 내용은 MySQL에서 행을 동적 열로 피벗하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!