Inquiridor
Uso do PIVOT SQL SERVER 2005

Pergunta
-
Pessoal, estou querendo usar o PIVOT para pegar os dados da tabela que são listados assim:
Disciplinas | Nota01 | Nota02
-----------------------------
Matemática 1,3 4,7
Português 7,8 9,5E listar eles assim:
Matemática Português
1,3 7,8
4,7 9,5Encontrei alguns exemplos do PIVOT na internet mas não ajudaram muito, alguém poderia me ajudar?
Todas as Respostas
-
-
WM8,
Veja este exemplo de Pivot no SQL Server 2005, trata-se de um exemplo já conhecido aqui no fórum:
Code SnippetCreate
table #Exemplo (codigo int, nome varchar(10), idUsuario int)insert
into #Exemplo (codigo, nome, idUsuario) Values (1,'jose', 12)insert
into #Exemplo (codigo, nome, idUsuario) Values (2,'mario', 7)insert
into #Exemplo (codigo, nome, idUsuario) Values (1,'jose', 14)insert
into #Exemplo (codigo, nome, idUsuario) Values (2,'mario', 12)insert
into #Exemplo (codigo, nome, idUsuario) Values (3,'celso', 7)insert
into #Exemplo (codigo, nome, idUsuario) Values (4,'andre', 14)Select
[jose],[mario],[celso],[andre] from #exemploPivot
(count(codigo) for nome in ([jose],[mario],[celso],[andre])) p-- CTE com Pivot --
with
consulta as (select codigo, nome from #Exemplo)Select
[jose],[mario],[celso],[andre] from ConsultaPivot
(count(codigo) for nome in ([jose],[mario],[celso],[andre])) p-- Trabalhando com funções de agregação no Pivot
CREATE
TABLE Sales (EmpId INT, Yr INT, Sales MONEY)INSERT
Sales VALUES(1, 2005, 12000)INSERT
Sales VALUES(1, 2006, 18000)INSERT
Sales VALUES(1, 2007, 25000)INSERT
Sales VALUES(2, 2005, 15000)INSERT
Sales VALUES(2, 2006, 6000)INSERT
Sales VALUES(3, 2006, 20000)INSERT
Sales VALUES(3, 2007, 24000)SELECT
[2005], [2006], [2007]FROM
(SELECT Yr, Sales FROM Sales) AS sPIVOT
(SUM(Sales) FOR Yr IN ([2005], [2006], [2007])) AS pSELECT
[2005], [2006], [2007], [2005] + [2006] + [2007] As TotalFROM
(SELECT Yr, Sales FROM Sales) AS sPIVOT
(SUM(Sales) FOR Yr IN ([2005], [2006], [2007])) AS p -
Boa Tarde,
Desculpe a gafe. Vi agora que o post é de SQL Server 2005. Embora ele tenha operadores PIVOT e UNPIVOT eu receio que ainda não tenhamos operadores de SLIDE and DICE (funcionalidade que você está buscando). Ainda assim, é possível fazer algo do tipo com um maior ou menor nível de trabalho. Para isso gostaria de saber
As disciplinas são fixas ?
As notas são fixas ?
[ ]s,
Gustavo
-
-
-
-
-
-
-
-
-
A Query é essa, isso ajuda Gustavo?
SELECT ALUNOS.Matricula, ALUNOS.codTurma AS Turma, ALUNOS.Nome, NOTAS.codTurma, NOTAS.codDisciplina,
NOTAS.Prova11, NOTAS.Prova12 FROM ALUNOS, NOTAS WHERE ALUNOS.Matricula = NOTAS.Matricula AND
(ALUNOS.codTurma = '1MA') -
-
Na tabela alunos os dados estão assim:
MATRICULA | ALUNO | CODTURMA
--------------------------------------------------------------
0001-2008 WILLIAM 1MA
e aqui registros de outros alunos começando com 0002-2008 etc...
Na tabela NOTAS
MATRICULA | DISCIPLINAS | NOTA01 | NOTA02
-----------------------------------------------------------------------
0001-2008 Matemática 1,3 4,7
0001-2008 Português 7,8 9,5e aqui registros de outros alunos começando com 0002-2008 etc..
Gostaria que ficasse assim:
ALUNO | MATÉRIA | NOTA 01 | NOTA 02 | MATÉRIA | NOTA 01 | NOTA 02 |
-------------------------------------------------------------------------------------
William | Matemática | 1,3 | 4,7 | Português | 7,8 | 9,5
e aqui vai o restante dos alunos seguindo a mesma seqüência...Não sei se vai ter jeito, por isso eu não inclui a tabela alunos no início, porque a tabela notas também tem o número de matrícula então eu não queria quebrar a cabeça informando o nome junto com as notas, caso não tenha jeito eu queria só assim mesmo:
Matricula Matemática Português
0001-2008 1,3 7,8
0001-2008 4,7 9,5A tabela Notas também tem o campo matrícula então fica mais fácil.
Agradeço mais uma vez Gustavo!