Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Boa Tarde Amigos..
Tenho uma tabela com o Ano_Mês e o Valor, porém nem todos os meses eu tenho valor nessa tabela.
Ex:
2018-01 - 10.000,00
2018-02 - 23.000,00
2018-05 - 40.000,00
2018-07 - 50.000,00
A minha dúvida é:
Preciso que os períodos de 2018-03, 2018-04 e 2018-06 sejam carregados com o valor do último mês.
Ex:
2018-01 - 10.000,00
2018-02 - 23.000,00
2018-03 - 23.000,00
2018-04 - 23.000,00
2018-05 - 40.000,00
2018-06 - 40.000,00
2018-07 - 50.000,00
Tem como fazer isso na carga ?
Obrigado
Renato
Olá, Renato!
Tente o script abaixo:
Dados:
Load Date#(Ano_Mês, 'YYYY-MM') As Ano_Mês,
Valor
Inline
[Ano_Mês, Valor
2018-01, 10.000,00
2018-02, 23.000,00
2018-05, 40.000,00
2018-07, 50.000,00
];
Tmp:
First 1
Load Date(Min(Ano_Mês)) As MinAno_Mês,
Num(((Year(Max(Ano_Mês)) * 12) + Month(Max(Ano_Mês))) - (((Year(Min(Ano_Mês)) * 12) + Month(Min(Ano_Mês)))) + 1) As Intervalo
Resident Dados;
Tmp2:
Load Date(AddMonths(Peek('MinAno_Mês', 0, 'Tmp'), RowNo() - 1), 'YYYY-MM') As Ano_Mês
AutoGenerate(Peek('Intervalo'));
Left Join
Load * Resident Dados;
Resultado:
NoConcatenate
Load Ano_Mês,
If(IsNull(Valor), Peek('Valor'), Valor) As Valor
Resident Tmp2
Order By Ano_Mês;
Drop Tables Tmp, Tmp2, Dados;
Resultado:
Renato,
Teste assim:
set vMaxData=date(today());
set vMinData=Date(AddMonths(today(),-24)); //Troque o 24 pela qtde de meses que você quer retroagir
tempCal:
Load
$(vMinData)+iterno()-1 as tempdata,
date($(vMinData)+iterno()-1) as Data,
Date($(vMinData)+iterno()-1,'YYYY-MM') as Ano_Mês
autogenerate 1 while $(vMinData)+iterno()-1<=$(vMaxData);
Left Join (tempCal)
Load
Ano_Mês,
Valor
From Sua_Base;
Renato
Esse campo Ano_Mês é data ou texto?
A tabela é em Excel?
A saída é utilizar a função peek(), mas talvez que fazer tratamento do campo para comparar as informações
Olá Luis
O campo é texto.
A tabela é do banco de dados.
Olá, Renato!
Tente o script abaixo:
Dados:
Load Date#(Ano_Mês, 'YYYY-MM') As Ano_Mês,
Valor
Inline
[Ano_Mês, Valor
2018-01, 10.000,00
2018-02, 23.000,00
2018-05, 40.000,00
2018-07, 50.000,00
];
Tmp:
First 1
Load Date(Min(Ano_Mês)) As MinAno_Mês,
Num(((Year(Max(Ano_Mês)) * 12) + Month(Max(Ano_Mês))) - (((Year(Min(Ano_Mês)) * 12) + Month(Min(Ano_Mês)))) + 1) As Intervalo
Resident Dados;
Tmp2:
Load Date(AddMonths(Peek('MinAno_Mês', 0, 'Tmp'), RowNo() - 1), 'YYYY-MM') As Ano_Mês
AutoGenerate(Peek('Intervalo'));
Left Join
Load * Resident Dados;
Resultado:
NoConcatenate
Load Ano_Mês,
If(IsNull(Valor), Peek('Valor'), Valor) As Valor
Resident Tmp2
Order By Ano_Mês;
Drop Tables Tmp, Tmp2, Dados;
Resultado:
Bela solução Daniel! Funciona perfeitamente e com os requisitos que o Renato possui..
Eu escolheria a sua solução para fechar a thread!
Olá Daniel
Bom Dia.!
Eu rodei com os dados da minha tabela e esta apresentando um erro.
Tem como você disponibilizar parte desses dados num excel para eu dar uma olhada?
Opa...
Segue o qvf e o qvd.
Muito Obrigado
O seu qvd carrega normalmente com o script que postei, e roda sem erros aqui.
O problema é que os dados estão agrupados por "familia", e cada "familia" aparentemente tem dois valores para cada "Ano_Mês". Neste caso, eu não sei qual dos dois valores que deve ser copiado para o próximo período, caso ele esteja faltando. Sem contar que você aparentemente tem duas colunas de valores ("estoque" e "cvm").
Todos esses detalhes foram omitidos no seu post inicial, e receio que boa parte da lógica que empreguei na minha resposta tenha que ser alterada.