2010-08-15 4 views
0

은 다음과 같이 테이블을 감안할 때 : 나는 SQL을 어떻게 사용합니까MySQL 쿼리 도움말 :이 테이블을 피벗하는 방법?

============================================== 
| ID1 | ID2 | ID3 | Name   | Value | 
============================================== 
| 16 | 1 | 100 | item_name  | Toys  | 
| 16 | 2 | 101 | item_name  | Computer | 
| 16 | 1 | 102 | item_price | 55  | 
| 16 | 2 | 103 | item_price | 200  | 
| 16 | 1 | 104 | animal_name | dog  | 
| 16 | 2 | 105 | animal_name | cat  | 
| 16 | 1 | 106 | animal_gender | male  | 
| 16 | 2 | 107 | animal_gender | female | 
| 18 | 1 | 100 | item_name  | Toys  | 
| 18 | 2 | 101 | item_name  | Computer | 
| 18 | 1 | 102 | item_price | 55  | 
| 18 | 2 | 103 | item_price | 200  | 
| 18 | 1 | 104 | animal_name | dog  | 
| 18 | 2 | 105 | animal_name | cat  | 
| 18 | 1 | 106 | animal_gender | male  | 
| 18 | 2 | 107 | animal_gender | female | 
---------------------------------------------- 

이처럼 만들기 위해 : 나는 PHP에서 SQL 쿼리를 생성한다

============================================================== 
| ID1 | item_name | item_price | animal_name | animal_gender | 
============================================================== 
| 16 | Toys  | 55   | dog   | male   | 
| 16 | Toys  | 55   | cat   | female  | 
| 16 | Computer | 200  | dog   | male   | 
| 16 | Computer | 200  | cat   | female  | 
| 18 | Toys  | 55   | dog   | male   | 
| 18 | Toys  | 55   | cat   | female  | 
| 18 | Computer | 200  | dog   | male   | 
| 18 | Computer | 200  | cat   | female  | 
-------------------------------------------------------------- 

.

+1

정말 귀하의 질문에 대답하지 않지만 제 생각에는 가능한 경우 데이터베이스 디자인을 재고해야합니다. –

+0

첫 번째 테이블은 실제로 복잡한 쿼리의 결과입니다. 한 단계 더 나아가려면이 작업을 수행해야합니다. – StackOverflowNewbie

답변

1

는 SONewbie의 발언 다음 편집

이어야한다 ANSI 호환 :

SELECT 
    ID1, 
    MAX(CASE WHEN Name = 'item_name' THEN Value ELSE NULL END) AS item_name, 
    MAX(CASE WHEN Name = 'item_price' THEN Value ELSE NULL END) AS item_price, 
    MAX(CASE WHEN Name = 'animal_name' THEN Value ELSE NULL END) AS animal_name, 
    MAX(CASE WHEN Name = 'animal_gender' THEN Value ELSE NULL END) AS animal_gender 
FROM tbl 
GROUP BY ID1, ID2; 

이렇게하면 원하는 출력이 정확하게 생성되지 않습니다. 출력은 다음과 같이 표시됩니다

============================================================== 
| ID1 | item_name | item_price | animal_name | animal_gender | 
============================================================== 
| 16 | Toys  | 55   | dog   | male   | 
| 18 | Toys  | 55   | dog   | male   | 
| 16 | Computer | 200  | cat   | female  | 
| 18 | Computer | 200  | cat   | female  | 
-------------------------------------------------------------- 

이 때문에 ID1과 ID2 링크 고양이와 여성 컴퓨터와 200 만, 같은 필드는 장난감과 55 개 남성을 연결하면서. ID3으로 그룹화하면 ID1과 ID3이 함께 데이터 행을 고유하게 식별하므로 많은 NULL이 발생합니다.

+0

일부 셀에서 NULL이 발생합니다. 참조 : http://pastebin.com/u4fBLfWc. 다른 아이디어? – StackOverflowNewbie

+0

@SONewbie, 쿼리를 약간 편집하여 원래 제공 한 데이터로 NULL을 생성하지 않습니다. 편집 된 답변에 설명 된대로 요구 사항과 정확히 일치하지 않습니다 (일치하지 않음) 제공된 데이터). 또한 pastebin.com 링크의 결과에있는 데이터가 질문과 함께 제공된 데이터와 일치하지 않습니다. –

1

, MySQL 용 (ANSI의 SQL에서 작동하지 않습니다)이 시도 :

SELECT 
    ID1, 
    GROUP_CONCAT(if(Name = 'item_name', Value, NULL)) AS 'item_name', 
    GROUP_CONCAT(if(Name = 'item_price', Value, NULL)) AS 'item_price', 
    GROUP_CONCAT(if(Name = 'animal_name', Value, NULL)) AS 'animal_name', 
    GROUP_CONCAT(if(Name = 'animal_name', Value, NULL)) AS 'animal_name', 
FROM tbl 
GROUP BY ID1, ID2, ID3; 

(면책 조항 :. 데이터와 검증되지 않은)

+0

@chrss는 Mark의 제안과 동일한 것을 가지고 있습니다. http://pastebin.com/u4fBLfWc. 다른 아이디어? – StackOverflowNewbie