Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bom dia,
Sou usuária nova no Qlik Sense, e preciso de uma ajuda urgente.
Preciso gerar um tabela, através de outra tabela já carregada.
Tenho os campos:
Nome ( indica o nome da pessoa), dia, dias de produção (onde 0 indica que a pessoa não trabalhou e 1 que trabalhou), e o grupo.
Na tabela que tenho que gerar, precisava fazer um loop para que todo vez que mudasse o nome ou o grupo ou quando a pessoa não trabalhasse ( que é indicado pelo número 0) ela pegasse a data de inicio e fim desse período.
Vou tentar exemplificar genericamente, pois são muitos os meus dados
Tenho uma tabela parecida com esta carregada:
Nome | Dia | Dias de Produção | Grupo |
João | 12/12/2017 | 1 | Grupo 1 |
João | 12/12/2017 | 0 | - |
João | 13/12/2017 | 1 | Grupo 1 |
João | 13/12/2017 | 1 | Grupo 1 |
João | 14/12/2017 | 1 | Grupo 2 |
Maria | 12/12/2017 | 0 | - |
Maria | 12/12/2017 | 1 | Grupo 1 |
Maria | 14/12/2017 | 1 | Grupo 1 |
Maria | 14/12/2017 | 1 | Grupo 2 |
Maria | 14/12/2017 | 0 | - |
Maria | 15/12/2017 | 1 | Grupo 1 |
Ana | 15/12/2017 | 1 | Grupo 1 |
Ana | 16/12/2017 | 1 | Grupo 1 |
Ana | 17/12/2017 | 0 | - |
Ana | 18/12/2017 | 1 | Grupo 2 |
E através dela precisava gerar uma igual esta:
Nome | Data Início | Data Fim | Grupo |
João | 12/12/2017 | 12/12/2017 | Grupo 1 |
João | 13/12/2047 | 13/12/2017 | Grupo 1 |
João | 14/12/2017 | 14/12/2017 | Grupo 2 |
Maria | 12/12/2017 | 14/12/2017 | Grupo 1 |
Maria | 14/12/2017 | 14/12/2017 | Grupo 2 |
Maria | 15/12/2017 | 15/12/2017 | Grupo 1 |
Ana | 15/12/2017 | 16/12/2017 | Grupo 1 |
Ana | 18/12/2017 | 18/12/2017 | Grupo 2 |
Já pesquisei, mas ainda não achei nada por completo que me ajudasse.
E estou precisando urgentemente, se alguém pudesse me ajudar ficaria muito grata.
Os meus registros seriam basicamente esses, peguei genericamente, porque são milhares:
Nome | Dia | Dias Produtividade | Grupo | Porte |
Maria | 29/08/2016 | 1 | Grupo 1 | M |
Maria | 30/08/2016 | 1 | Grupo 1 | M |
Maria | 31/01/2017 | 1 | Grupo 1 | M |
Maria | 31/01/2017 | 1 | Grupo 2 | M |
Maria | 02/02/2017 | 1 | Grupo 3 | P |
Maria | 03/03/2017 | 1 | Grupo 3 | P |
Maria | 04/03/2017 | 0 | Grupo 3 | P |
Maria | 05/03/2017 | 1 | Grupo 3 | P |
Maria | 05/03/2017 | 1 | Grupo 3 | G |
Maria | 06/03/2017 | 1 | Grupo 3 | G |
João | 07/03/2017 | 1 | Grupo 3 | G |
João | 08/03/2017 | 0 | Grupo 4 | G |
João | 09/03/2017 | 1 | Grupo 3 | G |
João | 09/03/2017 | 1 | Grupo 3 | M |
No fim a tabela teria que vim assim, observa-se que quando a pessoa tem folga, é como se parasse e contasse novamente uma data de início e fim.
Nome | Dia Inicio | Dia Fim | Grupo | Porte |
Maria | 29/08/2016 | 31/01/2017 | Grupo 1 | M |
Maria | 31/01/2017 | 31/01/2017 | Grupo 2 | M |
Maria | 02/02/2017 | 03/03/2017 | Grupo 3 | P |
Maria | 05/03/2017 | 05/03/2017 | Grupo 3 | P |
Maria | 05/03/2017 | 06/03/2017 | Grupo 3 | G |
João | 07/03/2017 | 07/03/2017 | Grupo 3 | G |
João | 09/03/2017 | 09/03/2017 | Grupo 3 | G |
João | 09/03/2017 | 09/03/2017 | Grupo 3 | M |
Conseguiu entender?
Você não sabe o quanto está me ajudando.
Muito obrigada. Todas desta comunidade são muito solícitos!
A resposta do Thiago das Chagas me parece o que você. Testei o script e funcionou conforme a descrição da sua necessidade.
Bom Dia
e que como estou em outro pais fuso e diferente, mas vamos la o codigo que tu precisa
a unica diferenca que voce vai ver e do dia 04/04 que deixei como folga , se tu quiser quando a pessoa nao trabalhou, caso contrario voce filtra somente os trabalhados
/************************************************************************/
// 1 - Faco a leitura da Base Nao modelada
/************************************************************************/
Base_Modelada:
LOAD * INLINE [
Nome , Dia , Dias Produtividade , Grupo , Porte
Maria , 29/08/2016 , 1 , Grupo 1 , M
Maria , 30/08/2016 , 1 , Grupo 1 , M
Maria , 31/01/2017 , 1 , Grupo 1 , M
Maria , 31/01/2017 , 1 , Grupo 2 , M
Maria , 02/02/2017 , 1 , Grupo 3 , P
Maria , 03/03/2017 , 1 , Grupo 3 , P
Maria , 04/03/2017 , 0 , Grupo 3 , P
Maria , 05/03/2017 , 1 , Grupo 3 , P
Maria , 05/03/2017 , 1 , Grupo 3 , G
Maria , 06/03/2017 , 1 , Grupo 3 , G
João , 07/03/2017 , 1 , Grupo 3 , G
João , 08/03/2017 , 0 , Grupo 4 , G
João , 09/03/2017 , 1 , Grupo 3 , G
João , 09/03/2017 , 1 , Grupo 3 , M
];
/************************************************************************/
// 2 - Descobrir qual e o menor Data por grupo por pessoa
//
/************************************************************************/
Min_Data_Por_status:
LOAD
Min(Dia) as MinDtSituacaoPerDay,
Grupo,
Nome,
[Dias Produtividade],
Porte
Resident Base_Modelada
Group By
Grupo,
Nome,
[Dias Produtividade],
Porte
;
/************************************************************************/
// 3 - Descobrir qual e o maior horario por Equipamento
// e e por Status
/************************************************************************/
Max_Data_Por_status:
LOAD
Max(Dia) as MaxDtSituacaoPerDay,
Grupo,
Nome,
[Dias Produtividade],
Porte
Resident Base_Modelada
Group By
Grupo,
Nome,
[Dias Produtividade],
Porte
;
/************************************************************************/
// 4 - Crio uma tabela somente com Status e ATM para fazer
// a modelagem final
/************************************************************************/
BaseModeladaFinal:
NoConcatenate
LOAD Distinct
Nome,
Grupo,
Porte
Resident Base_Modelada
;
DROP Table Base_Modelada;
/************************************************************************/
// 5 - Faco o Join para tabela somente na tabela com status
// assim trago o menor para a tabela final
/************************************************************************/
Left Join (BaseModeladaFinal)
LOAD
Grupo,
Nome,
[Dias Produtividade],
Porte,
MinDtSituacaoPerDay as DtInicialStatus
Resident Min_Data_Por_status;
DROP Table Min_Data_Por_status;
/************************************************************************/
// 6 - Faco o Join para tabela somente na tabela com status
// assim trago o maior para a tabela final
/************************************************************************/
Left Join(BaseModeladaFinal)
LOAD
Grupo,
Nome,
[Dias Produtividade],
Porte,
MaxDtSituacaoPerDay as DtFinalStatus
Resident Max_Data_Por_status
;
DROP Table Max_Data_Por_status;
Ajustado:
LOAD
*,
if( [Dias Produtividade] = 0 , 'Folga','Trabalhado') as Status
Resident BaseModeladaFinal;
DROP Table BaseModeladaFinal;
Resultado :
Nome | Grupo | DtInicialStatus | DtFinalStatus | Status | Porte |
---|---|---|---|---|---|
Maria | Grupo 1 | 29/08/2016 | 31/01/2017 | Trabalhado | M |
Maria | Grupo 2 | 31/01/2017 | 31/01/2017 | Trabalhado | M |
Maria | Grupo 3 | 04/03/2017 | 04/03/2017 | Folga | P |
Maria | Grupo 3 | 02/02/2017 | 05/03/2017 | Trabalhado | P |
Maria | Grupo 3 | 05/03/2017 | 06/03/2017 | Trabalhado | G |
João | Grupo 3 | 07/03/2017 | 09/03/2017 | Trabalhado | G |
João | Grupo 3 | 09/03/2017 | 09/03/2017 | Trabalhado | M |
João | Grupo 4 | 08/03/2017 | 08/03/2017 | Folga | G |
Oi Thiago,
Bom dia!
é que nesse Scrip ainda encontro o problema que não está descontando o dia da folga.
Por exemplo. A maria folgou fia 04/03/2017 no grupo 3, porte P.
Então eu precisava que esse dia não fosse contato período de tempo nessa tabela. Porque depois eu vou precisar desses dias para fazer contas. Ai por exemplo, pra Maria, no grupo 3 no porte 3 ela trabalhou 3 dias.
De acordo com essa tabela olhando DtInicialStatus e DtFinalStatus ele trabalhou 4 dias.
Por isso, a tabela dos dias trabalhados tinha que ficar assim:
Nome | Dia Inicio | Dia Fim | Grupo | Porte |
Maria | 29/08/2016 | 31/01/2017 | Grupo 1 | M |
Maria | 31/01/2017 | 31/01/2017 | Grupo 2 | M |
Maria | 02/02/2017 | 03/03/2017 | Grupo 3 | P |
Maria | 05/03/2017 | 05/03/2017 | Grupo 3 | P |
Maria | 05/03/2017 | 06/03/2017 | Grupo 3 | G |
João | 07/03/2017 | 07/03/2017 | Grupo 3 | G |
João | 09/03/2017 | 09/03/2017 | Grupo 3 | G |
João | 09/03/2017 | 09/03/2017 | Grupo 3 | M |
Consigo fazer isso?
Muito obrigada!
Oi srchagas, boa tarde!
Desculpa o incomodo, seu scrip foi bastante útil.
Mas ainda não consegui resolver um detalhe, como descrevi abaixo.
E não faço ideia de como fazer isso. Será que conseguiria me ajudar?
Desde já, fico completamente agradecida pela atenção!
Não sei se descrevi bem o meu problema, mas é como se precisasse fazer um loop e cada vez que mudasse ou o nome, ou data, ou o grupo ou o porte ou mudasse de 0 para 1 e vice versa (o que ainda não consegui encaixar nesses scrips acima).
Precisaria parar e registrar aquele nome, aquele data de fim, aquele grupo e aquele porte. E assim Sucessivamente. Começaria anotando o próximo nome, o próximo grupo, a data, o próximo porte, até que alguma dessas variáveis mudasse novamente. E assim sucessivamente, até o fim dos meus dados. Formando uma tabela que exemplifiquei acima.
Alguém conseguiria me ajudar?
Meu script faz isso , ele marca todas as mudanças de grupo pq ele simplesmente verifica as maiores e menores entrada da pessoa por dia e por grupo
Então a se a pessoa muda de grupo funciona o que não entendi é o que está faltando aí sinceridade
Oi Thiago,
Rodei o seu scrip e ele me deu exatamente essa tabela:
Nome | DtInicialStatus | DtFinalStatus | Grupo | Porte | Status |
João | 07/03/2017 | 09/03/2017 | Grupo 3 | G | Trabalhado |
João | 09/03/2017 | 09/03/2017 | Grupo 3 | M | Trabalhado |
João | 08/03/2017 | 08/03/2017 | Grupo 4 | G | Folga |
Maria | 29/08/2016 | 31/01/2017 | Grupo 1 | M | Trabalhado |
Maria | 31/01/2017 | 31/01/2017 | Grupo 2 | M | Trabalhado |
Maria | 04/03/2017 | 04/03/2017 | Grupo 3 | P | Folga |
Maria | 02/02/2017 | 05/03/2017 | Grupo 3 | P | Trabalhado |
Maria | 05/03/2017 | 06/03/2017 | Grupo 3 | G | Trabalhado |
Vamos pegar o exemplo da MARIA No grupo 3 P. Ela trabalho no dia 2,3. Folgou dia 4 e voltou trabalhar dia 5.
Eu sei que nesta tabela eu tenho que ela folgou dia 4. Mas pelo data de Iniíco e de Fim do Grupo 3 P, é como se ela tivesse iniciado dia 2 e terminado dia 5.
Filtrando somente o status trabalhado é Como se ela tivesse trabalhado 4 dias, quando na verdade trabalhou apenas 3.
Eu precisaria que esse grupo 3 P fosse dividido em 2. Eu nem preciso saber o dia que ela folgou. Mas precisaria para esse exemplo que a Maria no grupo 3 P tivesse dois registro para os dias trabalhados:
Maria | 02/02/2017 | 03/03/2017 | Grupo 3 | P |
Maria | 05/03/2017 | 05/03/2017 | Grupo 3 | P |
Entendeu?
Como se cada dia de folga também fosse um pausa. Ou seja, um mesmo grupo, de uma mesa pessoa, de um mesmo porte, teria mais de um registro na tabela caso tivesse uma folga no período.
Para esses dados eu precisaria uma tabela de dias trabalhados final assim (essa tabela so tem os dias trabalhados):
Nome | Dia Inicio | Dia Fim | Grupo | Porte |
Maria | 29/08/2016 | 31/01/2017 | Grupo 1 | M |
Maria | 31/01/2017 | 31/01/2017 | Grupo 2 | M |
Maria | 02/02/2017 | 03/03/2017 | Grupo 3 | P |
Maria | 05/03/2017 | 05/03/2017 | Grupo 3 | P |
Maria | 05/03/2017 | 06/03/2017 | Grupo 3 | G |
João | 07/03/2017 | 07/03/2017 | Grupo 3 | G |
João | 09/03/2017 | 09/03/2017 | Grupo 3 | G |
João | 09/03/2017 | 09/03/2017 | Grupo 3 | M |
Não sei se conseguir transmitir bem a minha idéia. rsrs
Mas Será que é possível fazer isso no qlik?
Muito Obrigada por tentar me ajudar srchagas!
Entendi o problema , eu estava viajando e so voltei hoje, assim que conseguir finalizar os teste lhe mando
Muito obrigada Thiago!