>데이터 베이스 >MySQL 튜토리얼 >준비된 명령문을 사용하여 MySQL에서 데이터를 동적으로 피벗하는 방법은 무엇입니까?

준비된 명령문을 사용하여 MySQL에서 데이터를 동적으로 피벗하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-06 07:36:40654검색

How to Dynamically Pivot Data in MySQL Using Prepared Statements?

Prepared 문을 사용한 MySQL의 동적 피벗

MySQL에는 기본 PIVOT 함수가 없지만 집계 함수와 CASE 문을 사용하여 이를 에뮬레이트할 수 있습니다. 동적으로 데이터를 피벗하는 경우 준비된 문이 효율적인 솔루션을 제공합니다.

제품 부품 테이블이 있는 시나리오를 고려하세요.

CREATE TABLE Parts (
    part_id INT,
    part_type VARCHAR(1),
    product_id INT
);
INSERT INTO Parts (part_id, part_type, product_id) VALUES
(1, 'A', 1),
(2, 'B', 1),
(3, 'A', 2),
(4, 'B', 2),
(5, 'A', 3),
(6, 'B', 3);

원하는 출력은 각 부품 ID를 요약하는 피벗 테이블입니다. 제품:

product_id  part_A_id  part_B_id
----------  ----------  ----------
1           1          2
2           3          4
3           5          6

동적 피벗형 쿼리

SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
    CONCAT(
        'max(case when part_type = ''',
        part_type,
        ''' then part_id end) AS part_',
        part_type, '_id'
    )
) INTO @sql
FROM Parts;
SET @sql = CONCAT('SELECT product_id, ', @sql, ' 
                  FROM Parts 
                   GROUP BY product_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

정적 피벗 쿼리(제한된 열)

고정된 수의 피벗 열이 있는 정적 쿼리의 경우:

SELECT product_id,
    max(CASE WHEN part_type = 'A' THEN part_id END) AS part_A_id,
    max(CASE WHEN part_type = 'B' THEN part_id END) AS part_B_id
FROM Parts
GROUP BY product_id;

위 내용은 준비된 명령문을 사용하여 MySQL에서 데이터를 동적으로 피벗하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.