Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bom dia,
estou desenvolvendo um projeto para o RH onde o banco de dados é baseado em históricos,
imaginem que eu tenho um histórico de salário,
Mes 07 Salario 1500
Mes 09 Salario 2000
Neste exemplo eu tenho duas movimentações, em minha seleção, selecionando o mes 11 o salario vai trazer zerado, mas eu preciso que me traga o ultimo valor (2000), tentei fazer =Bottom(sum(Valor_Salario)) porém ele me retorna zero.
Antes de tudo, Feliz Natal
Boa noite.
A solução do Alan muito boa. Usa intervalmatch. Uma outra solução seria usar o iterno().
//==================================================================
Salario:
load * inline
[
Funcionario,Data ,Salario
A ,"01/01/2014" , 1000
A ,"01/03/2014" , 1100
A ,"01/06/2014" , 1500
B ,"01/01/2014" , 700
C ,"01/01/2014" , 800
C ,"01/03/2014" , 900
];
//==================================================================
Tmp:
LOAD
Funcionario,
Salario,
Date#(Data) as Data_Ini,
if(Previous(Funcionario) = Funcionario,date#(Previous(Data)),date(Today())) as Data_Fim
Resident Salario Order by Funcionario,Data desc;
//
SalarioFinal:
NoConcatenate
LOAD
*
,MonthStart(addmonths(Data_Ini, IterNo()-1)) as Data_Salario
Resident Tmp
WHILE MonthStart(addmonths(Data_Ini, IterNo()-1)) < Data_Fim;
//
DROP Tables Salario,Tmp;
EXIT Script;
Att,
Alessandro Furtado
Olá Hamilton,
Você pode resolver este problema no script desta forma:
Salario_TMP:
LOAD *
INLINE [
DataTMP, SalarioTMP
01/01/2014, 1000
01/05/2014, 1500
01/10/2014, 3000
];
Salario:
load
DataTMP as DataIni,
date(if (RowNo() = 1, MonthStart(Today()), Previous(DataTMP)-1))
as DataFim,
SalarioTMP as Salario
Resident Salario_TMP
order by DataTMP desc;
drop Table Salario_TMP;
LOAD MakeDate(2014, RowNo(), 01) as Data
AutoGenerate(12);
join (Salario)
IntervalMatch (Data)
LOAD
DataIni,
DataFim
Resident Salario;
DROP Fields DataIni, DataFim;
O resultado fica assim:
Envio o QVW em anexo para lhe apoiar no entendimento.
Boa Alan Feliciano Foi muito útil, porém quando eu tenho mais campos na tabela Salarios, por exemplo, Id_Funcionarios, como posso faer isso? Na forma deste exemplo ele só calcula a data para os primeiros registros.
Neste caso, temos que fazer o uso do Plano Cartesiano entre duas tabelas. Vamos criar um intervalo de datas para cada funcionário, assim teremos todos os funcionários preenchidos em todos os meses.
O script fica assim:
Salario_TMP:
LOAD *
INLINE [
FuncIdTMP, DataTMP, SalarioTMP
1, 01/01/2014, 1000
1, 01/05/2014, 1500
1, 01/10/2014, 3000
2, 01/01/2014, 1000
2, 01/05/2014, 1900
2, 01/10/2014, 3600
3, 01/04/2014, 5000
3, 01/09/2014, 8600
];
Salario:
load
DataTMP as DataIni,
if (Previous(FuncIdTMP) <> FuncIdTMP, MonthStart(Today()), Previous(DataTMP)-1)
as DataFim,
SalarioTMP as Salario,
FuncIdTMP as FuncId
Resident Salario_TMP
order by FuncIdTMP, DataTMP desc;
drop Table Salario_TMP;
Datas:
LOAD MakeDate(2014, RowNo(), 01) as Data
AutoGenerate(12);
Join (Datas)
load
Distinct FuncId
Resident Salario;
join (Salario)
IntervalMatch (Data)
LOAD
DataIni,
DataFim
Resident Salario;
DROP Fields DataIni, DataFim;
O resultado na tela fica assim:
Fazendo desta forma, você consegue atender sua necessidade.
Abraço.
Boa noite.
A solução do Alan muito boa. Usa intervalmatch. Uma outra solução seria usar o iterno().
//==================================================================
Salario:
load * inline
[
Funcionario,Data ,Salario
A ,"01/01/2014" , 1000
A ,"01/03/2014" , 1100
A ,"01/06/2014" , 1500
B ,"01/01/2014" , 700
C ,"01/01/2014" , 800
C ,"01/03/2014" , 900
];
//==================================================================
Tmp:
LOAD
Funcionario,
Salario,
Date#(Data) as Data_Ini,
if(Previous(Funcionario) = Funcionario,date#(Previous(Data)),date(Today())) as Data_Fim
Resident Salario Order by Funcionario,Data desc;
//
SalarioFinal:
NoConcatenate
LOAD
*
,MonthStart(addmonths(Data_Ini, IterNo()-1)) as Data_Salario
Resident Tmp
WHILE MonthStart(addmonths(Data_Ini, IterNo()-1)) < Data_Fim;
//
DROP Tables Salario,Tmp;
EXIT Script;
Att,
Alessandro Furtado
Bom dia,
os dois exemplos funcionaram perfeitamente,
apenas mais uma dúvida, utilizando o modelo do Alessandro Furtado,
Caso minha tabela de Salários tenha mais informações ou eu queira utilizar este mesmo recurso para outras tabelas, posso colocar todos os campos necessários dentro no IF correto?
Tmp:
LOAD
funcionario,
SalarioTMP,
id_numemp,
id_tipcol,
R038HSA_SEQALT,
Date#(DataTMP) as Data_Ini,
if(Previous(funcionario) = funcionario
or Previous(id_numemp)=id_numemp
or Previous(id_tipcol)=id_tipcol
or Previous(SEQALT)=SEQALT
,date#(Previous(DataTMP)),date(Today())) as Data_Fim
Resident SALARIO Order by funcionario,DataTMP desc;
Bom dia. Sim daria, mas tem que cuidar pois se um campo não for igual ele vai usar a data de hoje o que pode te gerar mais dados para o mesmo funcionário do que você precisa.
AMF
De: Hamilton Junior
Enviada em: segunda-feira, 29 de dezembro de 2014 09:20
Para: ALESSANDRO FURTADO
Assunto: Re: - Seleção da ultima data com Valor
<http://community.qlik.com/resources/images/palette-1004/headerLogo-1391206184624-QlikCommunity_logo.gif>
Voce tem alguma solução para quando eu tenho vários campos na tabela? ao contrario do que eu coloquei na resposta acima, eu coloco o AND no IF e não o OR
if(Previous(funcionario) = funcionario
and Previous(id_numemp)=id_numemp
and Previous(id_tipcol)=id_tipcol
andPrevious(SEQALT)=SEQALT
O problema é que tenho muitos dados, esta difícil validar isto.
Eu fiz um modelo de RH mas sempre usava a comparação do funcionário e não ele + outros campos. Voce precisa validar todos se são iguais?
AMF
De: Hamilton Junior
Enviada em: terça-feira, 30 de dezembro de 2014 17:51
Para: ALESSANDRO FURTADO
Assunto: Re: - Seleção da ultima data com Valor
<http://community.qlik.com/resources/images/palette-1004/headerLogo-1391206184624-QlikCommunity_logo.gif>
Isso mesmo Alessandro, eu tenho várias tabelas que trabalham com históricos, mesma ideia do salario,
exemplo, histórico de empresa, nela mostra todas as transferencias de filial que o funcionário teve, alguns campos que tenho nessa tabela é o codigo do funcionario, empresa, unidade, data, motivo, cargo, etc. Acredito que os campos sejam todos iguais para as linhas. Acha que eu posso usar a mesma logica?