[SQL] MySQL의 동적 피벗
SQLMySQL의 동적 피벗
이 같은 제품 부품의 테이블이 있습니다 :
부속
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.불행하게도, 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.SQL Server가 PIVOT 키워드를 가지고 있지만, MySQL을 사용하면 CASE 많은 중 하나를 사용해야합니다 / 문이나 조인의 많은 IF.
SQL Server가 PIVOT 키워드를 가지고 있지만, MySQL을 사용하면 CASE 많은 중 하나를 사용해야합니다 / 문이나 조인의 많은 IF.
다음은이 작업을 수행하는 방법의 이전 게시물입니다.
-
==============================
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
from https://stackoverflow.com/questions/12630128/mysql-dynamic-pivot by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MS Access에서 데이터를 회전식 (0) | 2020.04.02 |
---|---|
[SQL] 기록 횟수> (1)를 찾기위한 SQL 쿼리 (0) | 2020.04.02 |
[SQL] 삽입 및 인출 java.time.LocalDate는 H2와 같은 SQL 데이터베이스에서 /에 객체 (0) | 2020.04.02 |
[SQL] 어떻게 날짜에 주 수를 변환하는? (0) | 2020.04.02 |
[SQL] MySQL은 : 분할 쉼표는 여러 행으로 구분 된 목록 (0) | 2020.04.02 |