terça-feira, 20 de novembro de 2012

Pivot e UNPIVOT


Se você já trabalhou com o Microsoft Access, você poderia ter usado a instrução TRANSFORM para criar uma consulta de referência cruzada. Mesmo que a funcionalidade semelhante foi perdida no SQL Server 2000, podemos conseguir o mesmo no SQL Server 2005, através do operador PIVOT com a instrução SELECT. O operador PIVOT pode ser usado para transformar um conjunto de linhas em colunas, enquanto o operador UNPIVOT complementa o operador PIVOT, permitindo-lhe girar as colunas em linhas.

Aqui está um exemplo

DECLARE @ tabela tblStudents (

INT IDENTITY StudentID,

StudentName VARCHAR (100),

CollegeName VARCHAR (100),

JoinedOn DATETIME
)
INSERT INTO @ tblStudents
SELECT 'Zero', 'College_One', '20010101 '
UNION ALL
SELECT 'One', 'College_One', '20010102 '
UNION ALL
SELECT 'Dois', 'College_One', '20010202 '
UNION ALL
SELECT 'três', 'College_Two', '20010202 '
UNION ALL
SELECT 'Quatro', 'College_One', '20020302 '
UNION ALL
SELECT 'Five', 'College_One', '20030202 '
UNION ALL
SELECT 'Seis', 'College_Two', '20040202 '
UNION ALL
SELECT 'Seven', 'College_Two', '20040202 '
UNION ALL
SELECT 'Oito', 'College_Three', '20040202 '

SELECT *
DE @ tblStudents

SELECIONE CollegeName,

[2001] AS Yr2001,

[2002] AS Yr2002,

[2003] AS Yr2003,

[2004] AS Yr2004
FROM (SELECT StudentName,

CollegeName,

ANO (JoinedOn) Yr

DE @ tblStudents) st
PIVOT (Contagem (StudentName) PARA Yr IN ([2001], [2002], [2003], [2004])) tp



Aqui está outro exemplo

Exemplo2

USE AdventureWorks

SELECT EmployeeID,

[2002] Yr2002,

[2003] Yr2003,

[2004] Yr2004
FROM (SELECT year OrderYear (OrderDate),

EmployeeID,

TotalDue

DE Purchasing.PurchaseOrderHeader) poh
PIVOT (SUM (TotalDue) PARA OrderYear IN ([2002], [2003], [2004])) pvt
ORDER BY EmployeeID

Exemplo 3:

DECLARE @ TABELA guia (id INT IDENTITY, estado VARCHAR (1000))
INSERT INTO @ Tab SELECT 'Concluído'
INSERT INTO Tab @ SELECT 'Enviado'
INSERT INTO 'InProgress' @ guia Selecionar
INSERT INTO Tab @ SELECT 'Enviado'
INSERT INTO @ Tab SELECT 'Concluído'

SELECT [Submitted], [Concluído], [InProgress]
FROM (

Selecione Status, COUNT (*) cnt
DE Tab @
GROUP BY Estado) t
PIVOT (SUM (CNT) para o status IN ([Enviado], [Concluído], [InProgress])) uma

...

Nenhum comentário:

Postar um comentário