Array
(
)

Pivot - Transformar linhas em colunas dinamicamente

Jothaz
   - 17 dez 2014

Os dados estão assim:
Clique na imagem para abrir em uma nova janela

Preciso exibí-los assim:
Clique na imagem para abrir em uma nova janela
Pesquisando achei este link: Pivot dinâmico com SQL Server
E cheguei ao seguinte script, que me atende:
#Código

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.

Marisiana
   - 17 dez 2014

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

Jothaz
   - 17 dez 2014


Citação:
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.

Alex Lekao
   - 17 dez 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.

Jothaz
   - 17 dez 2014


Citação:
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.

Alex Lekao
   - 17 dez 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

Marisiana
   - 17 dez 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.

Alex Lekao
   - 18 dez 2014

Verdade Marisiana,

Me lembro deste post. rsrsr

Jothaz
   - 19 dez 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.

Marisiana
   - 19 dez 2014

Por nada Jothaz!
Bom trabalho!

Alex Lekao
   - 22 dez 2014

blz.

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

Boa sorte e bom trabalho com seu projeto.

Abraco.