itsource

행을 열로 피벗

mycopycode 2023. 1. 15. 17:21
반응형

행을 열로 피벗

다음을 생성하는 SQL 조회가 있습니다.

col1  | col2 | col3
=====================
item1 | key1 | value1
---------------------
item1 | key2 | value2

다음은 쿼리입니다.

SELECT t1.col1, t2.col2, t2.col3
FROM table1 t1
JOIN table2 t2 ON t1.id = t1.table1_id

표 1의 데이터:

id | col1
=========
1  | item1
2  | item1

표 2의 데이터:

table1_id | col2 | col3
=====================
1         | key1 | item1
1         | key2 | item2
2         | key1 | item1
2         | key2 | item2
2         | key3 | item3

행의 수는 다이나믹하기 때문에, 경우에 따라서는 다음과 같은 것도 취득할 수 있습니다.

col1  | col2 | col3
=====================
item2 | key1 | value1
---------------------
item2 | key2 | value2
---------------------
item2 | key3 | value3

첫 번째 쿼리는 다음과 같이 종료됩니다.

col1  | key1   | key2
=======================
item1 | value1 | value2

두 번째 질문은 다음과 같습니다.

col1  | key1   | key2   | key3
==============================
item2 | value1 | value2 | value3

너무 복잡해지지 않고 쉽게 할 수 있는 방법이 있을까요?MariaDB를 사용하고 있습니다.

이 질문을 원하는 것 같습니다.

SET SESSION group_concat_max_len = 1000000;

SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN t2.col2= ''',
      t2.col2,
      ''' THEN t2.col3 END) AS ',
      t2.col2
    )
   )INTO @sql
FROM  
     t1
JOIN  t2 ON t1.id = t2.table1_id
;


SET @sql=CONCAT('SELECT t1.col1, ',@sql,' FROM   
     t1
JOIN  t2 ON t1.id = t2.table1_id');

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

바이올린을 켜다

다른 아이템이 있는 경우 아이템별로 그룹화할 수 있습니다.

바이올린을 켜다

언급URL : https://stackoverflow.com/questions/27972461/pivot-rows-into-columns

반응형