Usuário com melhor resposta
Converter Linhas repetidas em Colunas

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
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
-
Gapimex,
consegui fazer através do integration servicesinfelizmente 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
Todas as Respostas
-
Olá Ednilton Santos,
Tudo bem?
Então você só precisa de auxílio com a consulta é isso?
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.
-
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
-
Oi, Leo.
O meu Select sai esta informação:
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
-
-
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
-
-
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
-
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 integrationexemplo 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
-
link da imagem https://social.msdn.microsoft.com/Forums/getfile/740387
este é o resultado resultado esperado
Ednilton Santos
-
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
-
-
Boa tarde,
Por falta de retorno do usuário, esta thread será encerrada.
Caso seja necessário, por gentileza, abra uma thread nova.
AtenciosamenteMarcos 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.
-
Gapimex,
consegui fazer através do integration servicesinfelizmente 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