Come convertire i campi in righe tramite SQL in MS Access 2007 o MS SQL Server 2005
-
22-07-2019 - |
Domanda
Ho una tabella legacy di MS Access 2007 che contiene 52 campi (1 campo per ogni settimana dell'anno) che rappresentano i dati storici delle vendite (più un campo per l'anno in realtà). Vorrei convertire questo database in un elenco Time / Value più convenzionale.
Qualcuno sa come farlo senza scrivere query con oltre 52 parametri espliciti?
(se esiste una soluzione in MS SQL Server 2005, posso anche esportare / importare la tabella)
Soluzione
UNPIVOT
esegue quasi il contrario operazione diPIVOT
, ruotando colonne in righe. Supponiamo che la tabella prodotto nell'esempio precedente è memorizzato nel database comepvt
e tu vuoi ruotare gli identificatori di colonnaEmp1
,Emp2
,Emp3
,Emp4
eEmp5
in valori di riga che corrispondono a fornitore particolare. Questo significa che tu deve identificare due colonne aggiuntive. La colonna che conterrà il valori di colonna che stai ruotando (Emp1
,Emp2
, ...) verrà chiamatoEmployee
e la colonna che lo farà contenere i valori che attualmente risiedono sotto le colonne da ruotare sarà essere chiamato Ordini. Queste colonne corrisponde a pivot_column e value_column , rispettivamente, in Definizione Transact-SQL. Ecco il query.
--Create the table and insert values as portrayed in the previous example.
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,
Emp3 int, Emp4 int, Emp5 int)
GO
INSERT INTO pvt VALUES (1,4,3,5,4,4)
INSERT INTO pvt VALUES (2,4,1,5,5,5)
INSERT INTO pvt VALUES (3,4,3,5,4,4)
INSERT INTO pvt VALUES (4,4,2,5,5,4)
INSERT INTO pvt VALUES (5,5,1,5,5,5)
GO
--Unpivot the table.
SELECT VendorID, Employee, Orders
FROM
(SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
FROM pvt) p
UNPIVOT
(Orders FOR Employee IN
(Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt
GO
Ecco un set di risultati parziale.
VendorID Employee Orders
1 Emp1 4
1 Emp2 3
1 Emp3 5
1 Emp4 4
1 Emp5 4
2 Emp1 4
2 Emp2 1
2 Emp3 5
2 Emp4 5
2 Emp5 5
...
Altri suggerimenti
Come accennato in precedenza, l'operatore UNPIVOT, se disponibile, lo farà ... Se questo non è disponibile, l'approccio SQL standard è:
Dichiarazioni a selezione multipla dell'Unione (una per ogni settimana) che alias la colonna della settimana specifica con lo stesso nome di colonna
Select 1 as week, Week1Val as value from Table
UNION
Select 2 as week, Week2Val as value from Table
UNION
Select 3 as week, Week3Val as value from Table
UNION
...
UNION
Select 52 as week, Week52Val as value from Table
Non è necessario esportare in SQL Server. In Access, prova il sottomenu / Visualizza / Tabella pivot Visualizza. (È nel mio Access 2003, in ogni caso.) Mi piace meglio di quello in Excel.