복붙노트

[SQL] MySQL의 동적 피벗

SQL

MySQL의 동적 피벗

이 같은 제품 부품의 테이블이 있습니다 :

부속

part_id      part_type      product_id
--------------------------------------
1            A              1
2            B              1
3            A              2
4            B              2
5            A              3
6            B              3

나는 다음과 같은 테이블을 반환하는 쿼리를 원하는 :

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

실제 구현에서 제품 부품의 수백만이있을 것

해결법

  1. ==============================

    1.불행하게도, MySQL은 피벗 기능이 없습니다하지만 당신은 집계 함수와 CASE 문을 사용하여 모델링 할 수 있습니다. 동적 버전의 경우 준비된 문을 사용해야합니다 :

    불행하게도, MySQL은 피벗 기능이 없습니다하지만 당신은 집계 함수와 CASE 문을 사용하여 모델링 할 수 있습니다. 동적 버전의 경우 준비된 문을 사용해야합니다 :

    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;
    

    SQL 바이올린 함께 데모를 참조하십시오

    당신은 단지 몇 열을 가지고 있다면, 당신은 정적 버전을 사용할 수 있습니다 :

    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
    
  2. ==============================

    2.SQL Server가 PIVOT 키워드를 가지고 있지만, MySQL을 사용하면 CASE 많은 중 하나를 사용해야합니다 / 문이나 조인의 많은 IF.

    SQL Server가 PIVOT 키워드를 가지고 있지만, MySQL을 사용하면 CASE 많은 중 하나를 사용해야합니다 / 문이나 조인의 많은 IF.

    다음은이 작업을 수행하는 방법의 이전 게시물입니다.

  3. ==============================

    3.단지 두 번을 참조 - (당신이 정말 많이 질문을하지 않아도 여기)

    단지 두 번을 참조 - (당신이 정말 많이 질문을하지 않아도 여기)

    select a.product_id, a.part_id "part_a_id", b.part_id "part_b_id"
    from parts a, parts b
    where a.product_id = b.product_id
    
  4. from https://stackoverflow.com/questions/12630128/mysql-dynamic-pivot by cc-by-sa and MIT license