sourcecode

행을 열로 동적으로 변환하는 Mysql 쿼리

copyscript 2023. 10. 1. 21:53
반응형

행을 열로 동적으로 변환하는 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에 새로운 항목이 추가되었다면, 이 추가 데이터 포인트를 수용하기 위해 결과 테이블이 자동으로 열 하나씩 확장되기를 원합니다.

사용가능GROUP BY그리고.MAX피벗을 시뮬레이션합니다.MySQL도 지원합니다.IF진술.

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

다음 값이 여러 개인 경우order, 쿼리를 수정할 필요가 없도록 동적 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     ║
╚════╩═══════╩═══════╝

사용하셔야 합니다.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 Fiddle이 있습니다.

언급URL : https://stackoverflow.com/questions/14834290/mysql-query-to-dynamically-convert-rows-to-columns

반응형