none
Uso do PIVOT SQL SERVER 2005 RRS feed

  • 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,5

     

    E listar eles assim:

    Matemática Português
    1,3               7,8
    4,7               9,5

     

     

    Encontrei alguns exemplos do PIVOT na internet mas não ajudaram muito, alguém poderia me ajudar?

    quarta-feira, 11 de junho de 2008 19:17

Todas as Respostas

  • Boa Tarde,

     

    Qual SQL Server você está utilizando ?^

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 11 de junho de 2008 19:21
  • WM8,

     

    Veja este exemplo de Pivot no SQL Server 2005, trata-se de um exemplo já conhecido aqui no fórum:

     

    Code Snippet

    Create 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 #exemplo

    Pivot (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 Consulta

    Pivot (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 s

    PIVOT (SUM(Sales) FOR Yr IN ([2005], [2006], [2007])) AS p

     

    SELECT [2005], [2006], [2007], [2005] + [2006] + [2007] As Total

    FROM (SELECT Yr, Sales FROM Sales) AS s

    PIVOT (SUM(Sales) FOR Yr IN ([2005], [2006], [2007])) AS p

     

     

     

     

    quarta-feira, 11 de junho de 2008 19:49
  • 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

     

    quarta-feira, 11 de junho de 2008 20:02
  • Gustavo,

     

    Estou procurando estes operadores e até o presente momento não encontrei!!!

     

    Acredito que as disciplinas sejam fixas mas as notas variáveis.

    quarta-feira, 11 de junho de 2008 20:09
  • Gustavo, as colunas são fixas mas as notas variam!!

    quarta-feira, 11 de junho de 2008 20:11
  • WM8,

     

    Existe um relacionamento entre as tables?

    quarta-feira, 11 de junho de 2008 20:17
  • Boa Tarde,

     

    No seu exemplo há três colunas (Disciplina, Nota01 e Nota02). Como as notas podem variar se há apenas duas colunas ? Para cada disciplina pode haver mais de duas notas ? Se sim, como é que isso é armazenado ?

     

    [ ]s,

     

    Gustavo

    quarta-feira, 11 de junho de 2008 20:17
  • Junior, vou pegar esses exemplos para ver se consigo fazer alguma coisa com eles.

     

    Obrigado!!

     

    quarta-feira, 11 de junho de 2008 20:32
  • Desculpe Gustavo, essas colunas são fixas, confundi com os registros!!

     

    quarta-feira, 11 de junho de 2008 20:36
  • Gustavo, tem um relacionamento sim, essas colunas estão em uma tabela chamada notas e ela está ligada a alunos pelo campo matricula que não informei aí.

    quarta-feira, 11 de junho de 2008 20:39
  • Oi,

     

    Você poderia postar o esquema das tabelas utilizadas para essa consulta ?

     

    [ ]s,

     

    Gustavo

    quarta-feira, 11 de junho de 2008 20:46
  • 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')

    quinta-feira, 12 de junho de 2008 13:17
  • Olá,

     

    Já ajuda, mas agora estamos tratando com mais elementos. No problema original, tinhamos apenas disciplinas e notas e agora temos a matrícula do Aluno. Como ficaria o leiaute final da query ?

     

    [ ]s,

     

    Gustavo

     

    quinta-feira, 12 de junho de 2008 14:02
  • 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,5

    e 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,5

     

    A tabela Notas também tem o campo matrícula então fica mais fácil.

    Agradeço mais uma vez Gustavo!

    quinta-feira, 12 de junho de 2008 14:50