2012-08-07 2 views
0

다음 데이터가 있습니다.보기의 MySQL 크로스 탭

RecordID |RecValue1 |RecValue2 |RecValue3    |Fields 
1072  |130227  |0   |      |Document_Number 
1072  |1241388 |0   |      |Supplier_Number 
1072  |20008968 |0   |      |Invoice_Number 
1072  |   |0   |1995-04-21 00:00:00 |Invoice_Date 
1072  |   |0   |1995-04-23 00:00:00 |Posting_Date 
1072  |Invoice |0   |      |Document_Type 
1072  |   |0   |1995-05-12 17:46:32 |Paid_Date 
1072  |F609  |0   |      |Entry_ID 

보기에 교차 테이블을 만드는 방법이 있습니까? 필드 열은 필드 표제를 포함하며 각 필드는 연관된 값을 갖지만 레코드 ID는 1입니다. 그래서 예제 RecordID 1072는 하나의 행에 롤업되어야합니다.

+0

물론 방법이 있습니다! 각 열에 조인을 추가하고 모든 것을 레코드 ID별로 연결하는 문제입니다. – bfavaretto

+0

각 필드와 관련된 값은 무엇입니까? 해당 필드 중 하나가 각 레코드와 동일하도록 3 개의 Recvalue 필드가 있습니까? – Taryn

+0

RecordID는이 둘을 연결합니다. – user1236443

답변

1

문제의 일부는 테이블 구조입니다.

SELECT RecordId, 
    MAX(CASE WHEN Fields = 'Document_Number' THEN recvalue END) Document_Number, 
    MAX(CASE WHEN Fields = 'Supplier_number' THEN recvalue END) Supplier_number, 
    MAX(CASE WHEN Fields = 'Invoice_number' THEN recvalue END) Invoice_number, 
    MAX(CASE WHEN Fields = 'Invoice_Date' THEN recvalue END) Invoice_Date, 
    MAX(CASE WHEN Fields = 'Posting_Date' THEN recvalue END) Posting_Date, 
    MAX(CASE WHEN Fields = 'Document_type' THEN recvalue END) Document_type, 
    MAX(CASE WHEN Fields = 'Paid_Date' THEN recvalue END) Paid_Date, 
    MAX(CASE WHEN Fields = 'Entry_ID' THEN recvalue END) Entry_ID 
FROM 
(
    SELECT RecordId, RecValue1 RecValue, fields 
    FROM test 
    UNION ALL 
    SELECT RecordId, RecValue2 RecValue,fields 
    FROM test 
    UNION ALL 
    SELECT RecordId, RecValue3 RecValue, fields 
    FROM test 
) unpvt 
GROUP BY RecordId 

이 쿼리가 세 recvalue 열과 곳에서 모든 값을 취 SQL Fiddle with Demo

참조 : 당신이 UNION ALL 다음 CASE 문이 작업을 수행해야합니다 불행히도 MySQL의는 PIVOT/UNPIVOT 기능이 없습니다 하나의 열에 그 값을 변환하여 하나의 데이터 행으로 변환 할 수 있습니다.

+0

보기에 대해 작성할 수있는 방법이 있습니까? 나는보기에 from 절에 하위 쿼리가 있다고 생각하지 않습니다. – user1236443

+0

하위 쿼리의 뷰를 만든 다음 쿼리 할 수 ​​있다고 생각합니다. 따라서 'UNION ALL'질의의 뷰를 생성하고 그 중 하나를 선택할 수 있습니다. – Taryn

+0

아, 재미있는 아이디어. 나는 그것을 시도 할 것이다. 감사. – user1236443