none
Como transformar colunas em linhas no sql 2000? RRS feed

  • Pergunta

  • Boa tarde pessoal,

    Tenho uma tabela no seguinte formato:

    id_aplicacao
    disciplina cod_prova alunos_presentes aluno 156408 84357 77223 89529
    381469 ARTE  314074 33 1 C A C B
    381469 ARTE  314074 33 2 C A C B
    381469 ARTE  314074 33 3 B B C B
    381469 ARTE  314074 33 6 A A C B
    381469 ARTE  314074 33 7 C A C B
    381469 ARTE  314074 33 11 C A C B
    381469 ARTE  314074 33 12 C B X

    B

    Eu preciso fazer uma consulta que me retorne o código da aplicação (id_aplicacao), o código da questao (156408,84357...) , quantos marcaram letra A nessa questao, quantos marcaram letra B , quantos marcaram letra C, quantos marcaram letra D e quantos nao responderam (marcaram x).

    Ex:

     

    id_aplicacao      id_questao        qtde_a   qtde_b  qtde_c  qtde_d  qtde_nr

    381469                156408                    1            1           5           0            0

    381469                84357                      5            2           0           0            0

    381469                77223                      6            0           0           0            1

    381469                89529                      0            7           0           0            0

     

    Como eu faço isso?

    Grata.

    segunda-feira, 3 de janeiro de 2011 14:09

Respostas

  • é uma solução amarrada, mas veja o exemplo abaixo:

    select id_aplicacao, '156408' as [Questão],
    [Qtd_A]=SUM(case when [156408]='A' then 1 else 0 end),
    [Qtd_B]=SUM(case when [156408]='B' then 1 else 0 end),
    [Qtd_C]=SUM(case when [156408]='C' then 1 else 0 end)
     from #Provas
    group by id_aplicacao,[156408]
    union
    select id_aplicacao, '84357' as [Questão],
    [Qtd_A]=SUM(case when [84357]='A' then 1 else 0 end),
    [Qtd_B]=SUM(case when [84357]='B' then 1 else 0 end),
    [Qtd_C]=SUM(case when [84357]='C' then 1 else 0 end)
     from #Provas
    group by id_aplicacao,[84357]
    
    


    Olavo Oliveira Neto
    Se for útil marque como resposta e faça um Developer feliz :)
    • Sugerido como Resposta Eder Costa quarta-feira, 5 de janeiro de 2011 15:09
    • Marcado como Resposta Eder Costa sexta-feira, 7 de janeiro de 2011 17:05
    segunda-feira, 3 de janeiro de 2011 18:13

Todas as Respostas

  • Lilid,

    Pesquise sobre pivot table. Talvez possa te ajudar.

     

    Att.,


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    segunda-feira, 3 de janeiro de 2011 14:51
  • Se não me engano o pivot so funciona no sql 2005 ou superior.
    segunda-feira, 3 de janeiro de 2011 15:17
  • creio que um select ja funcionaria pela descrição que vc apresentou por exemplo

     

    Select * From TbAplicacao a, TbQuestao q TbOpcao o
    Where a.Id_Aplicacao = q.IdAplicacao and
         q.Id_Questao = o.Id_Questao
    Group By Id_Opcao
    

    dessa forma retornara os o grupo por questao repondida,

    se houver a necessidade de saber a quantidade use o Select COUNT

     

    Espero ter Ajudado

    segunda-feira, 3 de janeiro de 2011 16:06
  • Daniel eu não entendi sua sugestao pois eu so tenho uma tabela.

    Desde ja agrandeço.

    segunda-feira, 3 de janeiro de 2011 17:18
  • Pelo que entendi vc quer a soma de quem escolheu A, B ou C .....

    então usa um SELECT COUNT com GROUP BY pela coluna que tem o A,B,C ...

     

    segunda-feira, 3 de janeiro de 2011 17:28
  • lilid, pivot table existe no sql server 2000 tambem. da uma olhada aqui http://www.devmedia.com.br/articles/viewcomp.asp?comp=5292

    por exemplo você pode fazer assim:

    create table #Provas(id_aplicacao int ,Disciplina nvarchar(255),cod_prova int not null,
    Alunos_presentes int not null, aluno int not null, [156408]char, [84357] char, [77223] char,[89529] char)
    go
    insert #Provas values
    (381469,'ARTE',314074,33,	1, 	'C','A','C','B'),
    (381469,'ARTE',314074,33,	2, 	'C' ,'A','C','B'),
    (381469,'ARTE',314074,33,	3, 	'B','B','C','B'),
    (381469,'ARTE',314074,33, 	6, 	'A','A','C','B'),
    (381469,'ARTE',314074,33, 	7, 	'C','A','C','B'),
    (381469,'ARTE',314074,33, 	11, 'C','A','C','B'),
    (381469,'ARTE',314074,33, 	12, 'C','B','X','B')
    	
    
    select id_aplicacao, [156408],
    [Qtd_A]=SUM(case when [156408]='A' then 1 end),
    [Qtd_B]=SUM(case when [156408]='B' then 1 end),
    [Qtd_C]=SUM(case when [156408]='C' then 1 end)
     from #Provas
    group by id_aplicacao,[156408]
    


    Olavo Oliveira Neto
    Se for útil marque como resposta e faça um Developer feliz :)
    segunda-feira, 3 de janeiro de 2011 17:34
  • Obrigada Olavo, sua sugestão foi útil mas ainda nao é exatamento o que eu preciso.

    Eu preciso que o codigo da questao deixe de ser uma coluna e passe a ser um dado.

    No exemplo que vc me passou ficaria assim:

    id_aplicacao    156408   Qtde_A  Qtde_B Qtde_C

    381469           A             1         NULL      NULL
    381469           B             NULL    1           NULL
    381469           C             NULL    NULL      5


    Eu preciso que a coluna de nome 156408 se torne um dado na linha assim, ´prque senao vou ter que repetir a consulta para cada questao.

    id_aplicacao    Questao          Qtde_A  Qtde_B Qtde_C

    381469           156408            1            1         5
    381469           84357              2            5         0         

     

    segunda-feira, 3 de janeiro de 2011 17:55
  • é uma solução amarrada, mas veja o exemplo abaixo:

    select id_aplicacao, '156408' as [Questão],
    [Qtd_A]=SUM(case when [156408]='A' then 1 else 0 end),
    [Qtd_B]=SUM(case when [156408]='B' then 1 else 0 end),
    [Qtd_C]=SUM(case when [156408]='C' then 1 else 0 end)
     from #Provas
    group by id_aplicacao,[156408]
    union
    select id_aplicacao, '84357' as [Questão],
    [Qtd_A]=SUM(case when [84357]='A' then 1 else 0 end),
    [Qtd_B]=SUM(case when [84357]='B' then 1 else 0 end),
    [Qtd_C]=SUM(case when [84357]='C' then 1 else 0 end)
     from #Provas
    group by id_aplicacao,[84357]
    
    


    Olavo Oliveira Neto
    Se for útil marque como resposta e faça um Developer feliz :)
    • Sugerido como Resposta Eder Costa quarta-feira, 5 de janeiro de 2011 15:09
    • Marcado como Resposta Eder Costa sexta-feira, 7 de janeiro de 2011 17:05
    segunda-feira, 3 de janeiro de 2011 18:13
  • Essa é uma solução interessante, porém trabalhosa, visto que tenho provas com até 20 questões.

    No entanto, foi muito útil.

    Obrigada.

    segunda-feira, 3 de janeiro de 2011 18:16
  • Sugiro que vc crie tabelas separadas, uma para alunos, outra para questões e outra para respostas(tendo em vista que as respostas são sempre alternativas)

    dessa forma fika facil de vc elaborar um filtro como vc quer
    segunda-feira, 3 de janeiro de 2011 18:20
  • LiliD!

    Algum progresso?

    Att;


    Eder Costa - LATAM Forum Support Engineer
    Microsoft Corporation
    quarta-feira, 5 de janeiro de 2011 15:09