2011-08-31 28 views
7

UNPIVOT在MS SQL-Server 2005中可用,但AFAIK不在MS Access 2010.中。如何通過板載方式實現?例如,我有一個表如何在Access 2010中模擬UNPIVOT?

ID | A | B | C | Key 1 | Key 2 | Key 3 
--------------------------------------- 
1 | x | y | z |  3 | 199 | 452 
2 | x | y | z | 57 | 234 | 452 

,並希望有一個表像

ID | A | B | C | Key 
-------------------- 
1 | x | y | z | 3 
2 | x | y | z | 57 
1 | x | y | z | 199 
2 | x | y | z | 234 
2 | x | y | z | 452 

鍵452是特例。目前我在OLEDB/ATL C++中進行旋轉。儘管速度夠快,但我還是很好奇。什麼是Access 2010最有效的SQL語句?

回答

8

這個查詢做到這一點...

SELECT ID, A, B, C, [Key 1] AS key_field 
FROM tblUnpivotSource 
UNION ALL 
SELECT ID, A, B, C, [Key 2] AS key_field 
FROM tblUnpivotSource 
UNION ALL 
SELECT ID, A, B, C, [Key 3] AS key_field 
FROM tblUnpivotSource; 

...返回該記錄(使用你的樣表值tblUnpivotSource).. 。

ID A B C key_field 
-- - - - --------- 
1 x y z   3 
2 x y z  57 
1 x y z  199 
2 x y z  234 
1 x y z  452 
2 x y z  452 
+0

看起來既好又明顯! –

1

不幸的是,沒有簡單的方法可以通過訪問來做到這一點。您可以通過使用一個UNION讓每個值

SELECT ID, A, B, C, [Key 1] As key 
FROM Table 
WHERE [Key 1] = 3 

UNION ALL 

SELECT ID, A, B, C, [Key 1] As key 
FROM Table 
WHERE [Key 1] = 57 

UNION ALL 

SELECT ID, A, B, C, [Key 2] As key 
FROM Table 
WHERE [Key 2] = 199 

UNION ALL 

SELECT ID, A, B, C, [Key 2] As key 
FROM Table 
WHERE [Key 2] = 234 

UNION ALL 

SELECT ID, A, B, C, [Key 3] As key 
FROM Table 
WHERE [Key 3] = 452 
+0

UNION ALL可能會更快,更安全。 – Fionnuala

+0

那麼,有沒有通用的解決方案?我們必須使用依賴於數據的語句? –

+0

@Remou true,我更新了查詢。我寫得太快了。 – Taryn

0

步驟1

您可以創建一個輔助表與價值觀 所有列名(可以用Excel來幫助您完成此:複製你表的第一行中的Excel>複製粘貼特殊>轉)

第2步

在表中創建一個自動遞增列和indexe此列

步驟3

創建一個新的查詢作爲交叉連接像

SELECT ID, A, B, C 
     , AUX_TABLE.KEY_FIELD 
     , DLookUp("[" & [AUX_TABLE].[KEY_FIELD] & "]","TABLE","[ID] = " & [TABLE].[ID]) AS KEY_VALUE 
FROM TABLE, AUX_TABLE; 

不要忘記維持性的你AUX_TABLE

對不起我的英語