복붙노트

[SQL] 열을 동적으로 변환 행에 MySQL의 쿼리

SQL

열을 동적으로 변환 행에 MySQL의 쿼리

많은 열이 같은 행에 필요한 동적으로 추가, 열을 행으로 변환 MYSQL 수 있습니다. 내 질문 피벗 테이블에 관련이있을 수 있다고 생각하지만 난 확신 그리고 난 다음 예제를 제공함으로써 이외의이 질문을 프레임하는 방법을 모르겠어요.

같이 두 테이블 A와 B, 주어

표 A

+--+-----+----+
|id|order|data|
+--+-----+----+
|1 |1    |P   |
+--+-----+----+
|2 |2    |Q   |
+--+-----+----+
|2 |1    |R   |
+--+-----+----+
|1 |2    |S   |
+--+-----+----+

나는 쿼리를 작성하고자 그 다음과 같습니다 :

표 결과

+--+-----+-----+
|id|data1|data2|
+--+-----+-----+
|1 |P    |S    |
+--+-----+-----+
|2 |R    |Q    |
+--+-----+-----+

기본적으로 나는 결과 테이블의 컬럼에 테이블 B의 각 행을 켜려고합니다. 새로운 엔트리는 ID = 1의 표 B에 첨가하고 있었다면, 그 다음 I는 자동적으로 결과 테이블이 추가 데이터 포인트를 수용하기 위해 하나 개의 컬럼에서 연장 할.

해결법

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

    1.당신은 시뮬레이션 피벗에 GROUP BY 및 MAX를 사용할 수 있습니다. IF 문 MySQL은 또한 지원합니다.

    당신은 시뮬레이션 피벗에 GROUP BY 및 MAX를 사용할 수 있습니다. IF 문 MySQL은 또한 지원합니다.

    SELECT  ID,
            MAX(IF(`order` = 1, data, NULL)) data1,
            MAX(IF(`order` = 2, data, NULL)) data2
    FROM    TableA
    GROUP   BY ID
    

    당신이 순서의 여러 값이있는 경우, 동적 SQL은 쿼리를 수정해야하지 않도록 적절한 더있을 수 있습니다 :

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'MAX(IF(`order` = ', `order`, ',data,NULL)) AS data', `order`)
      ) INTO @sql
    FROM TableName;
    
    SET @sql = CONCAT('SELECT  ID, ', @sql, ' 
                      FROM    TableName
                      GROUP   BY ID');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    두 쿼리의 출력 :

    ╔════╦═══════╦═══════╗
    ║ ID ║ DATA1 ║ DATA2 ║
    ╠════╬═══════╬═══════╣
    ║  1 ║ P     ║ S     ║
    ║  2 ║ R     ║ Q     ║
    ╚════╩═══════╩═══════╝
    
  2. ==============================

    2.당신은 PIVOT을 시뮬레이션 MAX와 GROUP BY를 사용해야합니다 :

    당신은 PIVOT을 시뮬레이션 MAX와 GROUP BY를 사용해야합니다 :

    SELECT Id,
       MAX(CASE WHEN Order = 1 THEN data END) data1,
       MAX(CASE WHEN Order = 2 THEN data END) data2
    FROM TableA
    GROUP BY Id
    

    그리고 여기에 SQL 바이올린입니다.

  3. from https://stackoverflow.com/questions/14834290/mysql-query-to-dynamically-convert-rows-to-columns by cc-by-sa and MIT license