FROM – Usando PIVOT e UNPIVOT
- 14/10/2019
- 5 minutos para ler
-
- V
- c
- M
- i
- M
-
+7
Aplica-se a: SQL Server (todas as versões com suporte) Banco de dados SQL do Azure Instância gerenciada do Azure SQL Azure Synapse Analytics Data Warehouse paralelo
Você pode usar os operadores relacionais PIVOT
e UNPIVOT
para alterar uma expressão com valor de tabela em outra tabela. PIVOT
gira uma expressão com valor de tabela, transformando os valores exclusivos de uma coluna na expressão em várias colunas na saída. E PIVOT
executa agregações onde elas “são necessárias em quaisquer valores de coluna restantes que são desejados na saída final. UNPIVOT
realiza a operação oposta para PIVOT girando colunas de uma expressão com valor de tabela em valores de coluna.
A sintaxe para PIVOT
fornece é mais simples e mais legível do que a sintaxe que poderia ser especificado em uma série complexa de SELECT...CASE
instruções. Para obter uma descrição completa da sintaxe de PIVOT
, consulte FROM (Transact-SQL).
Sintaxe
A sintaxe a seguir resume como usar o operador PIVOT
.
Observações
Os identificadores de coluna na cláusula UNPIVOT
seguem o agrupamento do catálogo. Para Banco de Dados SQL, o agrupamento é sempre SQL_Latin1_General_CP1_CI_AS
. Para SQL Server parcialmente contido bancos de dados, o agrupamento é sempre Latin1_General_100_CI_AS_KS_WS_SC
. Se a coluna for combin ed com outras colunas, uma cláusula de agrupamento (COLLATE DATABASE_DEFAULT
) é necessária para evitar conflitos.
Exemplo básico de PIVOT
O exemplo de código a seguir produz uma tabela de duas colunas com quatro linhas.
Aqui está o conjunto de resultados.
Nenhum produto é definido com três DaysToManufacture
.
O código a seguir exibe o mesmo resultado, dinamizado de forma que DaysToManufacture
os valores tornam-se os títulos das colunas. Uma coluna é fornecida por três dias, mesmo que os resultados sejam
NULL
.
Aqui está o conjunto de resultados .
Exemplo complexo de PIVOT
Um cenário comum em que PIVOT
pode ser útil é quando você deseja gerar relatórios de tabulação cruzada para fornecer um resumo dos dados. Por exemplo, suponha que você queira consultar a tabela PurchaseOrderHeader
no banco de dados de amostra AdventureWorks2014
para determinar o número de pedidos de compra feitos por certos funcionários. A consulta a seguir fornece este relatório, ordenado por fornecedor.
Aqui está um conjunto de resultados parcial.
Os resultados retornados por esta subseleção declaração são dinamizados na coluna EmployeeID
.
Os valores exclusivos retornados pelo EmployeeID
coluna tornam-se campos no conjunto de resultados final. Como tal, há “uma coluna para cada número EmployeeID
especificado na cláusula dinâmica: neste caso, funcionários 250
, 251
, 256
, 257
e 260
. div id = “c36dcf6b3b”> coluna serve como a coluna de valor, contra a qual as colunas retornadas na saída final, que são chamadas de colunas de agrupamento, são agrupadas. Nesse caso, as colunas de agrupamento são agregadas pelo COUNT
função. Observe que uma mensagem de aviso é exibida, indicando que quaisquer valores nulos que aparecem na PurchaseOrderID
coluna não foram “considerados ao calcular o COUNT
para cada funcionário.
Importante
Quando funções agregadas são usadas com PIVOT
, a presença de qualquer valor nulo na coluna de valor não é considerada ao calcular uma agregação.
Exemplo UNPIVOT
UNPIVOT
realiza quase a operação reversa de PIVOT
, girando as colunas em linhas. Suponha que a tabela produzida no exemplo anterior seja armazenada no banco de dados como pvt
, e você deseja girar os identificadores de coluna Emp1
, Emp2
, Emp3
, Emp4
e Emp5
em valores de linha que correspondem a um fornecedor específico. Como tal, você deve identificar duas colunas adicionais.A coluna que conterá os valores da coluna que você “rotaciona novamente (Emp1
, Emp2
, …) será chamada de Employee
, e a coluna que conterá os valores que existem atualmente nas colunas que estão sendo giradas será chamada de Orders
. Essas colunas correspondem a pivot_column e value_column , respectivamente, na definição Transact-SQL. Aqui está a consulta.
Aqui está um conjunto de resultados parcial.
Observe que UNPIVOT
não é o reverso exato de PIVOT
. PIVOT
realiza uma agregação e mescla várias linhas possíveis em uma única linha na saída. UNPIVOT
não reproduz o resultado da expressão com valor de tabela original porque as linhas foram mescladas. Além disso, os valores nulos na entrada de UNPIVOT
desaparecem na saída. Quando os valores desaparecem, isso mostra que pode ter havido valores nulos originais na entrada antes da operação PIVOT
.
O Sales.vSalesPersonSalesByFiscalYears
a visualização no banco de dados de exemplo AdventureWorks2012 usa PIVOT
para retornar o total de vendas de cada vendedor, para cada ano fiscal. Para criar um script da visualização no SQL Server Management Studio , no Pesquisador de Objetos, localize a visualização na pasta Visualizações do banco de dados AdventureWorks2012. Clique com o botão direito do mouse no nome da visualização e selecione Visualização de script como. -SQL)
CASE (Transact-SQL)