none
Transpor resultado da Coluna em Linha - SQL 2005 RRS feed

  • 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.

     

    segunda-feira, 31 de maio de 2010 18:50

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
    segunda-feira, 31 de maio de 2010 19:02
  • 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
    terça-feira, 1 de junho de 2010 01:35

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
    segunda-feira, 31 de maio de 2010 19:02
  • 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
    terça-feira, 1 de junho de 2010 01:35
  • 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!

     

    terça-feira, 1 de junho de 2010 13:02
  • 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!

     

    terça-feira, 1 de junho de 2010 13:06
  • 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]
    terça-feira, 1 de junho de 2010 13:40