PIVOT e UNPIVOT in SQL Server
PIVOTCREATE TABLE Prodotto
(
[CodProdotto] varchar(10)
, [Categoria] varchar(100)
, [Anno] numeric(4,0)
, [Prezzo] numeric(11,2)
)
UNPIVOT
Le operazioni di PIVOT e UNPIVOT son ben note a chiunque debba lavorare con strumenti quali Excel. In SQL Server, questi due operatori relazionali possono essere utilizzati per modificare un’espressione con valori di tabella in un’altra tabella. Essi consentono rispettivamente di trasformare valori di una tabella in valori di colonne e, viceversa, valori di colonna in valori di tabella. Vediamo come usarli.
Le operazioni di PIVOT e UNPIVOT son ben note a chiunque debba lavorare con strumenti quali Excel. In SQL Server, questi due operatori relazionali possono essere utilizzati per modificare un’espressione con valori di tabella in un’altra tabella. Essi consentono rispettivamente di trasformare valori di una tabella in valori di colonne e, viceversa, valori di colonna in valori di tabella. Vediamo come usarli.
Questa operazione trasforma i valori di una tabella in colonne della tabella stessa. Vediamo degli esempi.
Poniamo di avere una tabella anagrafica dei prodotti di questo tipo:
In ogni record abbiamo il codice del prodotto, la sua categoria, la sua marca ed il prezzo.
Questa operazione trasforma i valori di una tabella in colonne della tabella stessa. Vediamo degli esempi.
Poniamo di avere una tabella anagrafica dei prodotti di questo tipo:
In ogni record abbiamo il codice del prodotto, la sua categoria, la sua marca ed il prezzo.
Essa trasforma le colonne di una tabella in valori della tabella stessa. Vediamone degli esempi.
Poniamo di avere una tabella delle vendite d’abbigliamento di questo tipo:
CREATE TABLE Vendite ( [NrOrdine] varchar(6) , [CodArticolo] varchar(10) , [QtaXXS] int , [QtaXs] int , [QtaS] int , [QtaM] int , [QtaL] int , [QtaXL] int , [QtaXXL] int )
In ogni record abbiamo il numero dell’ordine di vendita, il codice dell’articolo che vendiamo, e sette colonne ciascuna indicante la quantità di articolo venduti per ciascuna taglia, dalla XXS alla XXL. Per semplicità di esempio, prendiamo un solo record da questa tabella:
Vogliamo trasformare questo singolo record in una tabella siffatta:
In altre parole, vogliamo che le sette colonne divengano dei valori di tabella, generando sette record – uno per ciascuna delle sette taglie – a partire dall’unico che abbia preso in considerazione. Per far ciò, eseguiremo un’operazione di UNPIVOT, scrivendo la seguente query:
SELECT U.[NrOrdine] , U.[CodArticolo] , RTRIM( SUBSTRING( U.[Taglia], 4, 3 ) ) AS [Taglia] , U.[Qta] FROM [dbo].[Vendite] V UNPIVOT ( [Qta] FOR [Taglia] IN ( [QtaXXS], [QtaXS], [QtaS], [QtaM], [QtaL], [QtaXL], [QtaXXL] ) ) U ;
NB. Senza l’operazione di SUBSTRING, il valore stringa della nuova colonna [Taglia]comprenderebbe anche il Qtainiziale.
Questo esempio è particolarmente semplice dato che le colonne delle quantità hanno tutte lo stesso tipo di dato, ovvero int. Se avessimo invece colonne di tipo diverso, anche solo nella lunghezza (per le stringhe) o precisione e scala (per i decimali)? In questo caso, è sufficiente dapprima convertire tutte le colonne interessate dall’operazione di UNPIVOT. Risulta di estrema comodità l’utilizzo di una common table expression: vediamo col seguente esempio, dove abbiamo delle colonne di tipo stringa, che poniamo essere tutte di differente lunghezza per definizione, e che decidiamo di convertire in nvarchar(MAX).
Fonte notizia
www.datamaze.it blogs post pivot-e-unpivot-in-sql-server