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)

È stato utile?

Soluzione

Uso di PIVOT e UNPIVOT .

  

UNPIVOT esegue quasi il contrario   operazione di PIVOT , ruotando   colonne in righe. Supponiamo che la tabella   prodotto nell'esempio precedente è   memorizzato nel database come pvt e tu   vuoi ruotare gli identificatori di colonna    Emp1 , Emp2 , Emp3 , Emp4 e Emp5 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à chiamato    Employee 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top