FROM – Utilizzo di PIVOT e UNPIVOT
- 10/14/2019
- 5 minuti per la lettura
-
- V
- c
- M
- i
- M
-
+7
Si applica a: SQL Server (tutte le versioni supportate) Database SQL di Azure Istanza gestita di Azure SQL Azure Synapse Analytics Parallel Data Warehouse
Puoi utilizzare gli operatori relazionali PIVOT
e UNPIVOT
per modificare unespressione con valori di tabella in unaltra tabella. PIVOT
ruota unespressione con valori di tabella trasformando i valori univoci di una colonna nellespressione in più colonne nelloutput. Inoltre, PIVOT
esegue le aggregazioni in cui “sono necessarie per i valori di colonna rimanenti desiderati nelloutput finale. UNPIVOT
esegue loperazione opposta a PIVOT ruotando le colonne di unespressione con valori di tabella in valori di colonna.
La sintassi per PIVOT
fornisce è più semplice e più leggibile della sintassi che potrebbe essere altrimenti specificato in una serie complessa di istruzioni SELECT...CASE
. Per una descrizione completa della sintassi di PIVOT
, vedere FROM (Transact-SQL).
Sintassi
La sintassi seguente riassume come utilizzare loperatore PIVOT
.
Osservazioni
Gli identificatori di colonna nella clausola UNPIVOT
seguono le regole di confronto del catalogo. Per il database SQL, le regole di confronto sono sempre SQL_Latin1_General_CP1_CI_AS
. Per SQL Server parzialmente contenuto database, le regole di confronto sono sempre Latin1_General_100_CI_AS_KS_WS_SC
. Se la colonna è combinata ed con altre colonne, è necessaria una clausola collate (COLLATE DATABASE_DEFAULT
) per evitare conflitti.
Esempio di PIVOT di base
Il seguente esempio di codice produce una tabella a due colonne con quattro righe.
Ecco il set di risultati.
Nessun prodotto è definito con tre DaysToManufacture
.
Il codice seguente mostra lo stesso risultato, ruotato in modo che DaysToManufacture
i valori diventano le intestazioni delle colonne. Viene fornita una colonna per tre giorni, anche se i risultati sono
NULL
.
Ecco il set di risultati .
Esempio PIVOT complesso
Uno scenario comune in cui PIVOT
può essere utile è quando si desidera generare rapporti a tabelle incrociate per fornire un riepilogo dei dati. Ad esempio, supponi di voler eseguire una query nella tabella PurchaseOrderHeader
nel database di esempio AdventureWorks2014
per determinare il numero di ordini di acquisto effettuati da determinati dipendenti. La query seguente fornisce questo rapporto, ordinato in base al fornitore.
Di seguito è riportato un set di risultati parziale.
I risultati restituiti da questa sottoselezione listruzione è imperniata sulla colonna EmployeeID
.
I valori univoci restituiti da EmployeeID
diventano campi nel set di risultati finale. In quanto tale, esiste “una colonna per ogni EmployeeID
numero specificato nella clausola pivot: in questo caso i dipendenti 250
, 251
, 256
, 257
e 260
. Il PurchaseOrderID
funge da colonna del valore, rispetto alla quale vengono raggruppate le colonne restituite nelloutput finale, chiamate colonne di raggruppamento. In questo caso, le colonne di raggruppamento vengono aggregate dal COUNT
. Si noti che viene visualizzato un messaggio di avviso che indica che eventuali valori nulli visualizzati nella colonna PurchaseOrderID
non sono stati “considerati durante il calcolo del id = “fccf2035df”> per ogni dipendente.
Importante
Quando si utilizzano funzioni aggregate con PIVOT
, la presenza di valori nulli nella colonna del valore non viene considerata quando si calcola unaggregazione.
Esempio UNPIVOT
UNPIVOT
esegue quasi loperazione inversa di PIVOT
, ruotando le colonne in righe. Supponi che la tabella prodotta nellesempio precedente sia archiviata nel database come pvt
e desideri ruotare gli identificatori di colonna Emp1
, Emp2
, Emp3
, Emp4
e Emp5
in valori di riga che corrispondono a un particolare fornitore. Pertanto, è necessario identificare due colonne aggiuntive.La colonna che conterrà i valori della colonna che stai ruotando (Emp1
, Emp2
, …) sarà chiamata Employee
e la colonna che conterrà i valori attualmente presenti sotto le colonne da ruotare sarà chiamata Orders
. Queste colonne corrispondono a pivot_column e value_column , rispettivamente, nella definizione Transact-SQL. Ecco la query.
Ecco un set di risultati parziale.
Si noti che UNPIVOT
non è “lesatto contrario di PIVOT
. PIVOT
esegue unaggregazione e unisce possibili più righe in una singola riga nelloutput. UNPIVOT
non riproduce il risultato dellespressione originale con valori di tabella perché le righe sono state unite. Inoltre, i valori nulli nellinput di UNPIVOT
scompaiono nelloutput. Quando i valori scompaiono, mostra che potrebbero esserci stati valori nulli originali nellinput prima delloperazione PIVOT
.
Il Sales.vSalesPersonSalesByFiscalYears
nel database di esempio AdventureWorks2012 utilizza PIVOT
per restituire le vendite totali per ogni venditore, per ogni anno fiscale. Per scrivere la vista in SQL Server Management Studio , in Esplora oggetti, individuare la vista nella cartella Viste per il database AdventureWorks2012. Fare clic con il pulsante destro del mouse sul nome della vista, quindi selezionare Visualizza script come.
Vedere anche
FROM (Transact -SQL)
CASE (Transact-SQL)