Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) While e pivot


MarcusRJ

Pergunta

Caros, boa tarde!

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

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

week | valor

1 | 43.4213

2 | 54.659

3 | 36.9564

4 | 23.4584

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!!!

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Bom dia Marcus,

é.... pelo que entendi o sql será dinâmico de acordo com a entrada de valores pelo usuário. Aí terá que fazer a montagem do sql também...

Postei um exemplo explicativo logo abaixo. Fiz uma tabela temporária com os dados que passou. Coloque o intervalo das semanas e rode. Faça os testes aí..

Espero que ajude!! :.)

-- Criação de tabela temporária
create table #teste (week INT, valor float)

-- Inserção dos dados
INSERT INTO #teste VALUES (1 , 43.4213)
INSERT INTO #teste VALUES (2 , 54.659)
INSERT INTO #teste VALUES (3 , 36.9564)
INSERT INTO #teste VALUES (4 , 23.4584)


--- Seleciona tudo e roda até o final
declare @weekInicial as integer
declare @weekFinal as integer
declare @SQL as VARCHAR(800)

-- Semana inicial do usuário
SET @weekInicial = 1

-- Semana Final do usuário
SET @weekFinal = 3
Set @SQL = 'select '

WHILE @weekInicial<=@weekFinal
BEGIN
  Set @SQL = @SQL + 'sum(case when week = ' + cast(@weekInicial AS VARCHAR) + ' then valor else null end)'
  SET @weekInicial = @weekInicial + 1
  if @weekInicial<=@weekFinal  
    Set @SQL = @SQL + ','
END

Set @SQL = @SQL + ' FROM #teste'

EXEC (@SQL)

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...