Pivot - Transformar linhas em colunas dinamicamente
Os dados estão assim:
[img]http://arquivo.devmedia.com.br/forum/imagem/238223-20141217-142716.png[/img]
Preciso exibí-los assim:
[img]http://arquivo.devmedia.com.br/forum/imagem/238223-20141217-142729.png[/img]
Pesquisando achei este link: [url:descricao=Pivot dinâmico com SQL Server]http://vladimirrech.blogspot.com.br/2014/02/pivot-dinamico-com-sql-server.html[/url]
E cheguei ao seguinte script, que me atende:
Gostaria de confirmar se é realmente este o caminho a seguir, ou se existem outras abordagens?
Esclarecendo o cenário. Tenho várias tabelas com vários indicadores por ano. Preciso exibir estes indicadores para analise e a melhor forma é planilhar.
Vale lembra que preciso gerar as colunas, no caso o Ano, dinamicamente, soluções com colunas fixas não vão atender ao requisitos da aplicação.
Desde já agradeço qualquer sugestão.
[img]http://arquivo.devmedia.com.br/forum/imagem/238223-20141217-142716.png[/img]
Preciso exibí-los assim:
[img]http://arquivo.devmedia.com.br/forum/imagem/238223-20141217-142729.png[/img]
Pesquisando achei este link: [url:descricao=Pivot dinâmico com SQL Server]http://vladimirrech.blogspot.com.br/2014/02/pivot-dinamico-com-sql-server.html[/url]
E cheguei ao seguinte script, que me atende:
create table #temp ( ano int not null, item int not null, valor int ) insert into #temp (ano,item, valor) values (2014,1,4400) insert into #temp (ano,item, valor) values (2015,1,4500) insert into #temp (ano,item, valor) values (2016,1,4600) insert into #temp (ano,item, valor) values (2017,1,4700) insert into #temp (ano,item, valor) values (2014,2,10600) insert into #temp (ano,item, valor) values (2015,2,10900) insert into #temp (ano,item, valor) values (2016,2,11000) insert into #temp (ano,item, valor) values (2017,2,11300) insert into #temp (ano,item, valor) values (2014,5,12000) insert into #temp (ano,item, valor) values (2015,5,13000) insert into #temp (ano,item, valor) values (2016,5,14000) insert into #temp (ano,item, valor) values (2017,5,15000) declare @cols nvarchar(max) set @cols = stuff(( select distinct ',' + quotename(ano) from #temp for xml path('') ), 1,1, ''); print @cols declare @query as nvarchar(max) set @query='SELECT * FROM ( SELECT item , ano , valor FROM #temp ) AS t PIVOT ( MAX(valor) FOR ano IN ( ' + @cols + ' ) ) as P;'; print @query execute(@query) drop table #temp
Gostaria de confirmar se é realmente este o caminho a seguir, ou se existem outras abordagens?
Esclarecendo o cenário. Tenho várias tabelas com vários indicadores por ano. Preciso exibir estes indicadores para analise e a melhor forma é planilhar.
Vale lembra que preciso gerar as colunas, no caso o Ano, dinamicamente, soluções com colunas fixas não vão atender ao requisitos da aplicação.
Desde já agradeço qualquer sugestão.
Soeuseijothaz
Curtidas 0
Respostas
Marisiana Battistella
17/12/2014
Na minha opinião, o uso do PIVOT é o melhor recurso a ser utilizado para esse caso.
GOSTEI 0
Soeuseijothaz
17/12/2014
Na minha opinião, o uso do PIVOT é o melhor recurso a ser utilizado para esse caso.
Também não vejo outra solução e vou usá-lo exaustivamente nesta aplicação.
Não gostei de criar a expressão em uma variável e executá-lo como comando, pois pode complicar a leitura e mesmo a criação (e olha vou ter expressões complicadas), mas fazer-se-a o que? kkkk
É sempre recomendado ouvir outras opiniões, quem sabe um maluco pode sugerir outra solução.
Apesar de acreditar que o princípio de Occam deve ser aplicado na medida do possível, não tenho preconceitos em relação a nenhuma abordagem.
GOSTEI 0
Alex Lekao
17/12/2014
Nao creio que havera outra alternativa.
Ate hoje o que pesquisei pensando em colunas dinamicas e tal, sempre chegava ao pivot.
Como a Marisiana disse, sera o pivot o melhor recurso.
Ate hoje o que pesquisei pensando em colunas dinamicas e tal, sempre chegava ao pivot.
Como a Marisiana disse, sera o pivot o melhor recurso.
GOSTEI 0
Soeuseijothaz
17/12/2014
Nao creio que havera outra alternativa.
Ate hoje o que pesquisei pensando em colunas dinamicas e tal, sempre chegava ao pivot.
Como a Marisiana disse, sera o pivot o melhor recurso.
Ate hoje o que pesquisei pensando em colunas dinamicas e tal, sempre chegava ao pivot.
Como a Marisiana disse, sera o pivot o melhor recurso.
Pois é sempre utilizei o Pivot e pesquisei muito antes de chegar ao script postado.
Agradeço a participação, pois este é o intuito do post, discutir e compartilhar informações.
Eu até tenho outro caminho, que seria usar o Access como banco de dados, pois ele faria isto de olhos fechados, mãos amarradas e no escuro. kkkk
Só que não dá para adotá-la.
GOSTEI 0
Alex Lekao
17/12/2014
kkk... normal...
cara eu ate preciso utiliza-lo, mas estou com preguica de rescrever todo o codigo que ja tenho, que esta com colunas fixas para 12 meses, e o povo tem usado, entao to deixando para depois ja faz um ano eu acho. kkkk
cara eu ate preciso utiliza-lo, mas estou com preguica de rescrever todo o codigo que ja tenho, que esta com colunas fixas para 12 meses, e o povo tem usado, entao to deixando para depois ja faz um ano eu acho. kkkk
GOSTEI 0
Marisiana Battistella
17/12/2014
Acredito que o PIVOT foi criado justamente para ser utilizado em situações como essa, tanto que ele só existe nas versões mais recentes do Oracle, SQLServer, ...
Tem SGBDs que não tem esse recurso, então tem que fazer uma manobra (quando não tem q fazer uma gambiarra) pra conseguir obter o retorno desejado.
Lembro que já entramos em uma conversa sobre um situação parecida mas a pessoa que criou a pergunta no fórum estava trabalhando com Firebird e, este, não possui o PIVOT ou nenhum outro recurso que faça o mesmo que o PIVOT faz.
Tem SGBDs que não tem esse recurso, então tem que fazer uma manobra (quando não tem q fazer uma gambiarra) pra conseguir obter o retorno desejado.
Lembro que já entramos em uma conversa sobre um situação parecida mas a pessoa que criou a pergunta no fórum estava trabalhando com Firebird e, este, não possui o PIVOT ou nenhum outro recurso que faça o mesmo que o PIVOT faz.
GOSTEI 0
Alex Lekao
17/12/2014
Verdade Marisiana,
Me lembro deste post. rsrsr
Me lembro deste post. rsrsr
GOSTEI 0
Soeuseijothaz
17/12/2014
Também só conheço o PIVOT, então será o caminho seguido.
Levando-se em consideração a complicação do projeto como um todo isto é uma das minhas menores preocupação.
Agradeço a todos por compartilhar opiniões.
Levando-se em consideração a complicação do projeto como um todo isto é uma das minhas menores preocupação.
Agradeço a todos por compartilhar opiniões.
GOSTEI 0
Marisiana Battistella
17/12/2014
Por nada Jothaz!
Bom trabalho!
Bom trabalho!
GOSTEI 0
Alex Lekao
17/12/2014
blz.
Cara, disponha, embora eu achei que minhas contribuicoes sao quase nulas. kkkk
Boa sorte e bom trabalho com seu projeto.
Abraco.
Cara, disponha, embora eu achei que minhas contribuicoes sao quase nulas. kkkk
Boa sorte e bom trabalho com seu projeto.
Abraco.
GOSTEI 0