2017-10-04 45 views
0

我有一個這樣的表格,我使用code1code2作爲主鍵。在SQL中使用兩列作爲主鍵的數據透視表

Code1 Code2 Data1 Data2 Data3 
11  0  a  b  7 
11  1  b  b  6 
12  2  z  v  5 

我想錶轉換成這樣:

Code1 Code2 TheData (create id ?) 
11  0  a   0 
11  0  b   1 
11  0  7   2 
11  1  b   0 
11  1  b   1 
11  1  6   2 
12  2  z   0 
12  2  v   1 
12  2  5   2 

我想過加入一個id,因爲我失去了其數據的我所插入的信息。

在後面的SQl中,我將使用id來檢索好的數據,但這不是問題。 'temp'中的列數是靜態的,所以我可以根據需要進行調整。

+0

1發生了什麼事? – Strawberry

+0

我忘記了,馬上編輯! –

回答

0

使用UNPIVOT更清潔,更高效,請確保以列格式轉換值。

SELECT Code1, Code2, Value, Idname 
FROM 
(SELECT Code1, Code2, 
CAST (Data1 AS varchar) AS Data1, 
    CAST (Data2 AS varchar) AS Data2, CAST (Data3 AS varchar) AS Data3 
FROM @table 
) temp 
UNPIVOT 
(
Value FOR Idname IN (Data1, 
    Data2, Data3) 
) as Result 
+0

'UNPIVOT'不是MySQL操作。 –

+0

對不起,我沒有檢查自動化標籤 –

3

您可以使用union all

select code1, code2, data1 as thedata, 0 as new_id from temp 
union all 
select code1, code2, data2 as thedata, 1 from temp 
union all 
select code1, code2, data3 as thedata, 2 from temp; 

如果你真的想您所指定的順序效果,請使用order by 1, 2, 4

+0

謝謝,我看到你做了什麼。我會嘗試這一點,但不使用樞軸會更有效率?我從來沒有使用過樞軸,並希望這次使用它。 –

+1

@Benoît沒有這樣的事情。 – Strawberry

+0

哦,好的。這是因爲我的臨時表是另一個包含最近值n的「歷史n-1」。之後我需要在表n中插入n-1行。我認爲PIVOT會有幫助,但我想你是對的。謝謝 –