Usuário com melhor resposta
Transpor resultado da Coluna em Linha - SQL 2005

Pergunta
-
Boa tarde a todos!
Por gentileza, preciso de uma ajuda,
Estou com um problema, preciso criar uma Select que retorne o resultado (dados) na forma de coluna, ou seja, de modo Transposto para que eu possa criar um relatório no RM-Classis da Totvs.
Exemplo:
Quando executo o select ele retorna a “Matriz Curricular” de uma determinada turma da escola.
DISCIPLINA
CODMAT
LPORT
1
HIST
3
GEOG
4
MAT
6
FÍS
12
QUÍM
13
BIOL
14
ED.FÍS
7
ARTE
24
INGL
9
O.PROJ
16
FIL
15
ESP
105
SOCIOL
271
Of.C/M
302
LB.RED
176
Eu preciso que a select retorne este resultado transposto, os dados em colunas.
CODTEMP
LPORT
HIST
GEOG
MAT
FÍS
QUÍM
CODMAT
1
3
4
6
12
13
Eu utilizo o SQL 2005.
Aguardo uma ajuda.
Obrigado a todos.
- Movido Gustavo Maia Aguiar segunda-feira, 31 de maio de 2010 19:48 (De:Alta Disponibilidade)
Respostas
-
Neto_sp4
vc pode usar o unpivot, abaixo um exemplo (do BOL)
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int, Emp3 int, Emp4 int, Emp5 int); GO INSERT INTO pvt VALUES (1,4,3,5,4,4); INSERT INTO pvt VALUES (2,4,1,5,5,5); INSERT INTO pvt VALUES (3,4,3,5,4,4); INSERT INTO pvt VALUES (4,4,2,5,5,4); INSERT INTO pvt VALUES (5,5,1,5,5,5); GO --Unpivot the table. SELECT VendorID, Employee, Orders FROM (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5 FROM pvt) AS p UNPIVOT (Orders FOR Employee IN (Emp1, Emp2, Emp3, Emp4, Emp5) )AS unpvt GO
att.
marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!- Marcado como Resposta Neto_sp4 terça-feira, 1 de junho de 2010 13:06
-
Neto boa noite, segue exemplo:
DECLARE @T AS TABLE (Materia varchar(10), Num int) INSERT INTO @T SELECT 'LPORT', 1 UNION SELECT 'HIST' , 3 UNION SELECT 'GEOG' , 4 UNION SELECT 'MAT' , 6 UNION SELECT 'FÍS' , 12 UNION SELECT 'QUÍM' , 13 SELECT [P].[LPORT], [P].[HIST] , [P].[GEOG] , [P].[MAT] , [P].[FÍS] , [P].[QUÍM] FROM @T AS [X] PIVOT ( MAX([X].[Num]) FOR [X].[Materia] IN ([LPORT],[HIST],[GEOG],[MAT],[FÍS],[QUÍM]) ) AS [P]
Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino- Marcado como Resposta Neto_sp4 terça-feira, 1 de junho de 2010 13:06
Todas as Respostas
-
Neto_sp4
vc pode usar o unpivot, abaixo um exemplo (do BOL)
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int, Emp3 int, Emp4 int, Emp5 int); GO INSERT INTO pvt VALUES (1,4,3,5,4,4); INSERT INTO pvt VALUES (2,4,1,5,5,5); INSERT INTO pvt VALUES (3,4,3,5,4,4); INSERT INTO pvt VALUES (4,4,2,5,5,4); INSERT INTO pvt VALUES (5,5,1,5,5,5); GO --Unpivot the table. SELECT VendorID, Employee, Orders FROM (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5 FROM pvt) AS p UNPIVOT (Orders FOR Employee IN (Emp1, Emp2, Emp3, Emp4, Emp5) )AS unpvt GO
att.
marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!- Marcado como Resposta Neto_sp4 terça-feira, 1 de junho de 2010 13:06
-
Neto boa noite, segue exemplo:
DECLARE @T AS TABLE (Materia varchar(10), Num int) INSERT INTO @T SELECT 'LPORT', 1 UNION SELECT 'HIST' , 3 UNION SELECT 'GEOG' , 4 UNION SELECT 'MAT' , 6 UNION SELECT 'FÍS' , 12 UNION SELECT 'QUÍM' , 13 SELECT [P].[LPORT], [P].[HIST] , [P].[GEOG] , [P].[MAT] , [P].[FÍS] , [P].[QUÍM] FROM @T AS [X] PIVOT ( MAX([X].[Num]) FOR [X].[Materia] IN ([LPORT],[HIST],[GEOG],[MAT],[FÍS],[QUÍM]) ) AS [P]
Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino- Marcado como Resposta Neto_sp4 terça-feira, 1 de junho de 2010 13:06
-
Ola! Pessoal,
Muito obrigado pela ajuda, eu já tentei utilizar a função de PIVOT, mas o que acontece, é que eu utilizo o SQL 2005 o nível de compatibilidade atual é 80 eu mudei para 90 e consegui gerar uma query com a PIVOT, porem o meu sistema RM-Classis deu vários erros no ambiente, então tive que voltar a compatibilidade para 80.
É valida a resposta de vocês, mas, preciso de outra lógica, estive conversando com um amigo ele disse para eu criar um cursor em que o cursor vai armazenar a select dentro do cursor e desta maneira irei alimenta a tabela temporária, mas o grande problema é que não sei fazer isso, sou novo em SQL e o que aprendi foi estudando pela internet e visitando os fóruns.
Sobre o relatório: as disciplinas mudam de curso para curso porem o relatório precisa ser flexível, quando a secretaria entrar com os dados no filtro Por exemplo: Filial, Curso e Turma o relatório deverá gerar a grade curricular “dessa turma”, o que eu preciso é apenas transpor essas informações o restante eu consigo fazer.
Vocês têm alguma outra solução ou um exemplo.
Ficarei no aguardo, muito obrigado amigos!
-
Ola! Pessoal,
Muito obrigado pela ajuda, eu já tentei utilizar a função de PIVOT, mas o que acontece, é que eu utilizo o SQL 2005 o nível de compatibilidade atual é 80 eu mudei para 90 e consegui gerar uma query com a PIVOT, porem o meu sistema RM-Classis deu vários erros no ambiente, então tive que voltar a compatibilidade para 80.
É valida a resposta de vocês, mas, preciso de outra lógica, estive conversando com um amigo ele disse para eu criar um cursor em que o cursor vai armazenar a select dentro do cursor e desta maneira irei alimenta a tabela temporária, mas o grande problema é que não sei fazer isso, sou novo em SQL e o que aprendi foi estudando pela internet e visitando os fóruns.
Sobre o relatório: as disciplinas mudam de curso para curso porem o relatório precisa ser flexível, quando a secretaria entrar com os dados no filtro Por exemplo: Filial, Curso e Turma o relatório deverá gerar a grade curricular “dessa turma”, o que eu preciso é apenas transpor essas informações o restante eu consigo fazer.
Vocês têm alguma outra solução ou um exemplo.
Ficarei no aguardo, muito obrigado amigos!
-
Neto,
Um detalhe importante, o cursor é um recurso fantástico, simples, prático e muito versátil, mas devemos tomar cuidado para utilizá-lo, pois trata-se de um dos recursos que mais consumo processador e memória do SQL Server durante sua execução.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]