none
Converter Linhas repetidas em Colunas RRS feed

  • Pergunta

  • Ola , Pessoal.

    Estou convertendo linhas em colunas utilizando o PIVOT, porem notei que na minha consulta só esta retornando o ultimo resultado, sei que deve ser devido ao MAX porem não conheço o que substituir o código, e meu problema é que eu meu chamado tem vários produtos cadastrados e com a opção max só retorna o ultimo registro e preciso de todos os registros registrados.
    exemplo:

    select cdchamado,
    cdtipoinformacaoadicional , [292] as NotaFiscal, [271] as TipoProduto FROM hd_chamadoinformacaoadicional PIVOT (MAX(nminformacao) FOR cdtipoinformacaoadicional in ([292],[271])) as p ;

    resultado:

    Chamado	cod.Tipoproduto	NotaFiscal	TipoProduto
    100	      10	      2345	A
    

    O que eu preciso que venha:

    Chamado	cod.Tipoproduto	NotaFiscal	TipoProduto
    100     	10	    2345        	A
    100     	5	    254         	B
    100     	10	    2345         	A
    

    Em resumo preciso converter linhas para colunas e estas linhas estão duplicadas, no ultimo exemplo acima, já transformei as linhas em colunas para melhor entender.


    Ednilton Santos

    segunda-feira, 19 de outubro de 2015 12:30

Respostas

  • Olá Ednilton,

    Antes de conseguir ajudar você preciso esclarecer alguns pontos do seu questionamento. Parece que você tem mais de uma dúvida então vou começar pela mais evidente.

    O motivo para você receber apenas um resultado usando o MAX é justamente porque a clausula MAX vai retornar unicamente o Maior Valor de sua tabela.

    Agora para resolver o seu cenário eu precisaria entender um pouco melhor a sua necessidade, ficou claro que você precisa converter linhas em colunas mas não entendi exatamente qual o resultado esperado por você? Se trata de pegar cada linha de sua tabela e transformar essas linhas em colunas de uma nova tabela?

    Para isso acho que você vai precisar usar um cursor ou loop while. Gostaria de compartilhar com você o artigo de ambos esses statments assim você pode dar uma olhada e as vezes a resposta para sua dúvida está no artigo em si.

    Mesmo assim eu aguardo o seu retorno com a resposta da minha pergunta sobre o seu cenário, assim consigo ajudar melhor você :D

    Cursores - exemplo básico de utilização
    WHILE (Transact-SQL)


    • Editado Leoferreira quinta-feira, 29 de outubro de 2015 17:37
    • Marcado como Resposta Ednilton Santos sexta-feira, 30 de outubro de 2015 14:33
    • Não Marcado como Resposta Ednilton Santos sexta-feira, 30 de outubro de 2015 14:33
    • Marcado como Resposta Ednilton Santos segunda-feira, 2 de novembro de 2015 18:02
    quinta-feira, 29 de outubro de 2015 17:37
  • Gapimex,
    consegui fazer através do integration servicesresultado pelo ssis

    infelizmente ficou um pouco de gambiarra, mas estava precisando muito da solução, o que fiz foi criar uma Task de que recebesse os valores e depois unir e incluir numa nova tabela.

    Criei uma Task "source origem" com um select com o pivot do conteúdo e uma condição na coluna sequencia que é o que liga as linhas repetidas ao numero do chamado, feito isso criei varias task e depois uni todas e incluindo em uma nova tabela.

    no sql teria que fazer um while como o leoferreira falou, porque teria que ser feito um contador sobre cada sequencia, como não tinha tempo e conhecimento a solução mais pratica foi no ssis.

    obrigado a todos que comentaram e reservou um pouco do tempo para me ajudar.

    Obrigado.


    Ednilton Santos

    • Marcado como Resposta Marcos SJ segunda-feira, 2 de novembro de 2015 18:53
    segunda-feira, 2 de novembro de 2015 18:12

Todas as Respostas

  • Olá Ednilton Santos,

    Tudo bem?

    Então você só precisa de auxílio com a consulta é isso?

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quinta-feira, 29 de outubro de 2015 17:10
  • Olá Ednilton,

    Antes de conseguir ajudar você preciso esclarecer alguns pontos do seu questionamento. Parece que você tem mais de uma dúvida então vou começar pela mais evidente.

    O motivo para você receber apenas um resultado usando o MAX é justamente porque a clausula MAX vai retornar unicamente o Maior Valor de sua tabela.

    Agora para resolver o seu cenário eu precisaria entender um pouco melhor a sua necessidade, ficou claro que você precisa converter linhas em colunas mas não entendi exatamente qual o resultado esperado por você? Se trata de pegar cada linha de sua tabela e transformar essas linhas em colunas de uma nova tabela?

    Para isso acho que você vai precisar usar um cursor ou loop while. Gostaria de compartilhar com você o artigo de ambos esses statments assim você pode dar uma olhada e as vezes a resposta para sua dúvida está no artigo em si.

    Mesmo assim eu aguardo o seu retorno com a resposta da minha pergunta sobre o seu cenário, assim consigo ajudar melhor você :D

    Cursores - exemplo básico de utilização
    WHILE (Transact-SQL)


    • Editado Leoferreira quinta-feira, 29 de outubro de 2015 17:37
    • Marcado como Resposta Ednilton Santos sexta-feira, 30 de outubro de 2015 14:33
    • Não Marcado como Resposta Ednilton Santos sexta-feira, 30 de outubro de 2015 14:33
    • Marcado como Resposta Ednilton Santos segunda-feira, 2 de novembro de 2015 18:02
    quinta-feira, 29 de outubro de 2015 17:37
  • Oi, Leo.
    O meu Select sai esta informação:

     https://social.msdn.microsoft.com/Forums/getfile/740361

    O cdchamado é o numero do registro.
    O cdtipoinformacaoadicional é o código da pergunta (nmtipoinformacaoadicinal) que desejo que vire uma coluna, podem notar que um chamado tem duas notas fiscais ou um chamado tem uma nota fiscal e dois produtos cadastrados.

    O pivot com o MAX ele faz um estilo 1 para 1, porem o meu cenário é 1 para n


    Ednilton Santos


    • Editado Ednilton Santos sexta-feira, 30 de outubro de 2015 17:47 correção da imagem
    sexta-feira, 30 de outubro de 2015 16:07
  • A cada produto cadastrado, ou nota fiscal adicionada gera uma sequencia(1..2...3) onde é nela que o sistema conseguir gerenciar uma relação.

    Ednilton Santos

    sexta-feira, 30 de outubro de 2015 16:12
  • Boa tarde,

    Ednilton, você pode postar um exemplo com uma amostra de dados da tabela sem o Pivot e o respectivo resultado esperado?


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 30 de outubro de 2015 16:27
  • posso sim, é que a imagem esta ficando corrompida

    link da imagem https://social.msdn.microsoft.com/Forums/getfile/740361 https://social.msdn.microsoft.com/Forums/getfile/740361

    Ednilton Santos

    sexta-feira, 30 de outubro de 2015 17:46
  • Experimente fazer um teste com a query que você postou no início substituindo a coluna cdtipoinformacaoadicional que está abaixo de cdchamado pela coluna nrsequencia para ver se é obtido o resultado desejado.

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Ednilton Santos sexta-feira, 30 de outubro de 2015 18:37
    • Não Marcado como Resposta Ednilton Santos sexta-feira, 30 de outubro de 2015 18:37
    sexta-feira, 30 de outubro de 2015 18:05
  • gapi, cheguei a fazer, porem meu vilão é o MAX

    No ssis consegui fazer a metade da consulta utilizando a função union onde eu colocava a condição de vim por numero de sequencia, porem não consigo fazer um union com o pivot através da consulta sql sem ser pelo integration

    exemplo do comando utilizado

    with Tab2 as (
    select cdchamado, 
    cdtipoinformacaoadicional, 
    nminformacao 
    
    from hd_chamadogrupoinformacao	
    
    where cdtipoinformacaoadicional in ('292','287','282','270','269','307','297','271')   and nrsequencia=1
    )
    select cdchamado
    , [292] as notafiscal
    , [287] as Espessura
    , [282] as Cor
    , [269] as Largura
    , [302] as ChapasAvariadas
    , [297] as CaixaChapas
    , [271] as TProduto
    
    
    
    from Tab2 pivot( max(nminformacao)  for cdtipoinformacaoadicional in ([292],[287],[282],[269],[302],[297],[271]) 
    
     ) as p


    Ednilton Santos


    • Editado Ednilton Santos sexta-feira, 30 de outubro de 2015 19:04 descrição
    sexta-feira, 30 de outubro de 2015 18:39
  • link da imagem https://social.msdn.microsoft.com/Forums/getfile/740387

    resultado esperadoeste é o resultado resultado esperado


    Ednilton Santos

    sexta-feira, 30 de outubro de 2015 18:46
  • Você pode postar mais linhas da tabela referente ao cdchamado 64142?

    A amostra que você postou acima contem apenas o código 292.

    Seria melhor ter mais uns 2 códigos referentes ao mesmo chamado para facilitar o entendimento.

    E seria melhor ainda se em vez da imagem você postasse as instruções SQL para criar a tabela e inserir algumas linhas com os dados do exemplo, pois assim facilitaria eventuais testes.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Marcos SJ segunda-feira, 2 de novembro de 2015 14:42
    • Não Marcado como Resposta Ednilton Santos segunda-feira, 2 de novembro de 2015 18:02
    sexta-feira, 30 de outubro de 2015 19:00
  • ta bem, vou montar os scripts e repasso

    Ednilton Santos

    sexta-feira, 30 de outubro de 2015 19:23
  • Boa tarde,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente

    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 2 de novembro de 2015 14:42
  • Gapimex,
    consegui fazer através do integration servicesresultado pelo ssis

    infelizmente ficou um pouco de gambiarra, mas estava precisando muito da solução, o que fiz foi criar uma Task de que recebesse os valores e depois unir e incluir numa nova tabela.

    Criei uma Task "source origem" com um select com o pivot do conteúdo e uma condição na coluna sequencia que é o que liga as linhas repetidas ao numero do chamado, feito isso criei varias task e depois uni todas e incluindo em uma nova tabela.

    no sql teria que fazer um while como o leoferreira falou, porque teria que ser feito um contador sobre cada sequencia, como não tinha tempo e conhecimento a solução mais pratica foi no ssis.

    obrigado a todos que comentaram e reservou um pouco do tempo para me ajudar.

    Obrigado.


    Ednilton Santos

    • Marcado como Resposta Marcos SJ segunda-feira, 2 de novembro de 2015 18:53
    segunda-feira, 2 de novembro de 2015 18:12