2011-08-31 9 views
7

UNPIVOT è disponibile in MS SQL-Server 2005, ma AFAIK non in MS Access 2010. Come può essere implementato con mezzi integrati? Per esempio, ho una tabellaCome simulare UNPIVOT in Access 2010?

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

e vogliono avere una tabella come

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 

Key 452 è un caso speciale. Attualmente eseguo la rotazione in OLEDB/ATL C++. Anche se è abbastanza veloce sono ancora curioso. Qual è l'istruzione SQL più efficiente per Access 2010 qui?

risposta

8

Questa interrogazione ...

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; 

... restituisce questo set di record (utilizzando i valori della tabella di esempio come 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

Sembra buono e ovvio! –

1

Sfortunatamente non esiste un modo semplice per farlo con l'accesso. È possibile farlo utilizzando un UNION per ottenere ogni valore

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 potrebbe essere più veloce e più sicuro. – Fionnuala

+0

Quindi, non esiste una soluzione generica? Dobbiamo usare una dichiarazione dipendente dai dati? –

+0

@Remou true, ho aggiornato la query. L'ho scritto troppo velocemente. – Taryn

0

Fase 1

È possibile creare una tabella ausiliaria con tutte le colonne nomi con valori (È possibile utilizzare Excel per aiutare con questo: copiare la prima riga di voi tabella in Excel> Copia Incolla speciale> trasposizione)

Fase 2

creare nella vostra tabella di una colonna di incremento automatico e: Indice di questa colonna

Fase 3

creare una nuova query come cross join come

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; 

Non dimenticare di maintence della vostra AUX_TABLE

dispiace il mio inglese

Problemi correlati