Pivot - Transformar linhas em colunas dinamicamente

17/12/2014

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: Pivot dinâmico com SQL Server

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.

Respostas

17/12/2014

Marisiana

Na minha opinião, o uso do PIVOT é o melhor recurso a ser utilizado para esse caso.
Responder Citar

17/12/2014

Jothaz

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.
Responder Citar

17/12/2014

Alex Lekao

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.
Responder Citar

17/12/2014

Jothaz

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.


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.
Responder Citar

17/12/2014

Alex Lekao

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
Responder Citar

17/12/2014

Marisiana

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.
Responder Citar

18/12/2014

Alex Lekao

Verdade Marisiana,

Me lembro deste post. rsrsr
Responder Citar

19/12/2014

Jothaz

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.
Responder Citar

19/12/2014

Marisiana

Por nada Jothaz!
Bom trabalho!
Responder Citar

22/12/2014

Alex Lekao

blz.

Cara, disponha, embora eu achei que minhas contribuicoes sao quase nulas. kkkk

Boa sorte e bom trabalho com seu projeto.

Abraco.
Responder Citar