2012-08-07 79 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 

有沒有辦法在視圖中創建交叉表。字段列包含字段標題,並且每個相應的字段應具有其關聯的值,但是具有1個記錄ID。所以在這個例子中RecordID 1072應該捲成一行。

+0

當然有辦法!這是一個爲每列添加連接並通過RecordID將所有內容綁定在一起的問題 – bfavaretto 2012-08-07 16:35:58

+0

每個字段的值是什麼?你有3個recvalue字段,這些字段中的哪一個等於每個記錄? – Taryn 2012-08-07 16:44:51

+0

RecordID將它們鏈接在一起。 – user1236443 2012-08-07 16:46:33

回答

1

你的問題的一部分是你的表結構。不幸的是,MySQL沒有一個PIVOT/UNPIVOT功能,所以你需要一個UNION ALL然後CASE語句來做到這一點:

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 

SQL Fiddle with Demo

此查詢需要的所有值從你的三個recvalue列和地點它合併爲一列,以便您可以將這些值轉換爲單行數據。

+0

有沒有一種方法可以寫成一個視圖。我不認爲你可以在視圖的from子句中使用子查詢 – user1236443 2012-08-07 16:58:41

+0

我相信你可以創建一個子查詢的視圖,然後查詢那個。因此,創建一個'UNION ALL'查詢的視圖,然後您可以從中進行選擇。 – Taryn 2012-08-07 17:02:48

+0

啊,是的,有趣的想法。我會嘗試的。謝謝。 – user1236443 2012-08-07 17:06:50