Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Marcus Barretto

[Resolvido] Pivot dinamica (colunas variaveis)

Recommended Posts

Caros, boa tarde!

Sou novo por aqui e espero poder ajudar com o que sei... mas hoje eu estou pedindo ajuda!

 

Seguinte, tenho uma query simples que me retorna duas colunas: semana e valor.

 

week | valor

1 | 43.4

2 | 54.65

3 | 36.9

4 | 23.4

 

e quero transformar isso em:

 

1 | 2 | 3 | 4

43.4 | 54.65 | 36.9 | 23.4

 

uma simples pivot. Para isso faço uma subquery e tudo certo.

 

select sum(case when week = 1 then valor else null end),

sum(case when week = 2 then valor else null end),

sum(case when week = 3 then valor else null end),

sum(case when week = 4 then valor else null end),

from ( --QUERY PRINCIPAL--).

 

O problema é que esse input de semana varia. O usuário entra com o valor 1 até 53 (semanas no ano) e de acordo com o input inserido a query puxa os valores referentes a 1ª semana do ano até a selecionada. Aí vem a dúvida. Como faço para a pivot ir se adaptando de acordo com o valor inserido?

 

Pensei em algo do tipo:

 

declare @controle as integer

declare @week as integer

set @controle = 0

set @week = 5 --POR EXEMPLO

 

select

while @controle < @week

begin

sum(case when week = @controle + 1 then valor else null end)

set @controle = @controle + 1

continue

from ( -- QUERY PRINCIPAL -- ).

 

Já sei que isso não funciona por motivos simples, como a falta da virgula (ou a presença) após o sum...

 

Alguém tem alguma idéia de como eu poderia fazer isso?

 

Valeu galera!

Abraços!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

A query teria de ser montada dinamicamente.

 

Suponha que sejam passadas as semanas de 5 a 8 :

 

um for acrescentaria a seguinte condição

 

sQry := 'select ...'

for i 1..4

'sum(case when week = ' i || ' then valor else null end) week'||i||','

end

' where ....and week between ' winicio ' || ' and ' wfim || ' ... '

---------------------------------------------------------------------------------------

Obs : Alguns programas geradores de relatório como o Crystral Reports fazem esta pivot deforma automática poupando muito do trabalho.

 

 

----------------------------------------------------------------

|| faz a concatenação no Oracle no SqlServer creio ser +

Atenção para a virgula da última coluna !!

Compartilhar este post


Link para o post
Compartilhar em outros sites

A query teria de ser montada dinamicamente.

 

Suponha que sejam passadas as semanas de 5 a 8 :

 

um for acrescentaria a seguinte condição

 

sQry := 'select ...'

for i 1..4

'sum(case when week = ' i || ' then valor else null end) week'||i||','

end

' where ....and week between ' winicio ' || ' and ' wfim || ' ... '

---------------------------------------------------------------------------------------

Obs : Alguns programas geradores de relatório como o Crystral Reports fazem esta pivot deforma automática poupando muito do trabalho.

 

 

----------------------------------------------------------------

|| faz a concatenação no Oracle no SqlServer creio ser +

Atenção para a virgula da última coluna !!

 

Valeu brigadão!!!

No SQL Server a concatenação é + mesmo

 

[]'s!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.