2013-04-07 4 views
-1

다른 플러그인에서 사용하는 MYSQL 테이블이 있습니다. 표에는 element_value 및 element_label이라는 두 개의 필드가 있습니다.여러 행에서 여러 열을 생성해야합니다.

element_value에는 보고서를 작성하려는 2500 명의 이름, 주소, 도시, 주 및 우편 번호가 들어 있습니다. 그러나 각 행을 가져 와서 자체 열을 만들고 싶습니다.

예를 들어, 테이블은 다음과 같다 :

**element_value** 
John Smith 
100 Elm Street 
Columbus 
Ohio 
13579 

element_label가 지표로서 사용된다. element_label 1 이름, 2 개 주소 3 도시 등 내가 열에서 데이터를으로 모니터 할 수 있도록하려는

관련 :

Name  Address  City  State  Zip 
John Smith 100 Elm Street Columbus Ohio  13579 

사람은 MYSQL 문을 사용하는 방법을 생각할 수

이것을하기 위해?

+0

이름을 어떻게 주소에 연결합니까? –

답변

0

행에서 열로의 이러한 유형의 변환을 피벗이라고합니다. MySQL에는 피벗 함수가 없지만 CASE 표현식을 가진 집계 함수를 사용하여 복제 할 수 있습니다.

select 
    max(case when element_label = 'Name' then element_value end) Name, 
    max(case when element_label = 'Address' then element_value end) Address, 
    max(case when element_label = 'State' then element_value end) State, 
    max(case when element_label = 'City' then element_value end) City, 
    max(case when element_label = 'Zip' then element_value end) Zip 
from yt 

SQL Fiddle with Demo를 참조하십시오

는 다음을 사용할 수 있습니다.

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(CASE WHEN element_label = ''', 
     element_label, 
     ''' THEN element_value else null END) AS `', 
     element_label, '`' 
    ) 
) INTO @sql 
FROM yt; 

SET @sql 
    = CONCAT('SELECT ', @sql, ' 
      from yt 
      '); 

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

SQL Fiddle with Demo를 참조하십시오 : 당신은 당신이 열로 변환 할 값의 알 수없는 번호를 가지고 있다면

는, 당신은 동적 SQL을 생성 할 준비가 문을 사용할 수 있습니다. 두 쿼리 모두 결과를 제공합니다.

|  NAME |  ADDRESS |  CITY | STATE | ZIP | 
---------------------------------------------------------- 
| John Smith | 100 Elm Street | Columbus | Ohio | 13579 | 

일반적으로 그룹화 할 열이 있습니다. 예를 들어 record_id 열이있는 경우 GROUP BY record_id을 추가하면 둘 이상의 결과 행이 반환됩니다.