Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Socorro!

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:

  

NomeDiaDias de ProduçãoGrupo
João12/12/20171Grupo 1
João12/12/20170-
João13/12/20171Grupo 1
João13/12/20171Grupo 1
João14/12/20171Grupo 2
Maria12/12/20170-
Maria12/12/20171Grupo 1
Maria14/12/20171Grupo 1
Maria14/12/20171Grupo 2
Maria14/12/20170-
Maria15/12/20171Grupo 1
Ana15/12/20171Grupo 1
Ana16/12/20171Grupo 1
Ana17/12/20170-
Ana18/12/20171Grupo 2

E através dela precisava gerar uma igual esta:

   

NomeData InícioData FimGrupo
João12/12/201712/12/2017Grupo 1
João13/12/204713/12/2017Grupo 1
João14/12/201714/12/2017Grupo 2
Maria12/12/201714/12/2017Grupo 1
Maria14/12/201714/12/2017Grupo 2
Maria15/12/201715/12/2017Grupo 1
Ana15/12/201716/12/2017Grupo 1
Ana18/12/201718/12/2017Grupo 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.

27 Replies
Thiago_Justen_

Boa tarde Victória,

Veja se é assim que você precisa:

ORIGEM:

LOAD * Inline [

    NOME,DATA,DIAS_PRODUCAO,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

   

];

FINAL:

LOAD

IF(DIAS_PRODUCAO=0,Previous(GRUPO),GRUPO) AS GRUPO

RESIDENT ORIGEM;

LEFT JOIN(FINAL)

LOAD

DATE(MAX(DATA))  AS DATA_FIM,

    DATE(MIN(DATA)) AS DATA_INICIO,

    NOME,

    GRUPO

RESIDENT ORIGEM GROUP BY NOME,GRUPO;

DROP TABLE ORIGEM;

Tabela Final.PNG

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago
Thiago_Justen_

Victória,

Não deixe de marcar como resposta correta se isso te ajudou.

Abraços e sucesso!!

Thiago

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago
Anonymous
Not applicable
Author

Thiago,

Testei o Scrip aqui e ele quase deu certo.

Poderia me explicar exatamente o que faz esse seu scrip. Estou começando a usar o Qlik agora, então estou bem no início.

Ele está retornando a data de início e fim literalmente de todos os grupos.

Por exemplo, se alguém não trabalhou em algum dia em um determinado grupo, mas no dia seguinte voltou a trabalhar no mesmo grupo, teria que haver uma pausa ai. Como se cada vez que aparecesse um 0, também fosse um determinante para anotar a data de Início e Fim para aquele nome e aquele grupo.

Além disso, existe outra variável que também deve ser considerada d mesmo jeito, que é o porte (P,M,G) e caso mude o porte também, deve ser anotado a Data de Início e Fim, esse porte deve ser adicionado a minha nova tabela.

Saberia me ajudar novamente?

Muito obrigada pela ajuda!

srchagas
Creator III
Creator III

Ola...Eu ja ajudei alguem com caso semelhante entao que voce consegue ajustar e usar

Modelagem no cálculo do tempo de indisponibilidade.

Anonymous
Not applicable
Author

Ola Thiago,

Não consegui abrir seu scrip nesse post.

Será que poderia me enviar?

Estou precisando resolver esse problema urgentemente.

Obrigada pela ajuda!

srchagas
Creator III
Creator III

Segue :

acho que isso deve te ajudar se voce precisa colocar mias parametros para definir voce so precisa adicionar no Load do MIn e do max e no order by o trque esta no Order By

se quiser as folgas junto, eu aconselho 2 coisas:

repetir esse codigo com Dias producao = 0

Ou que acho melhor , colocar o dias de producao no Load e no Order by e claro no load da tabela modelada

/************************************************************************/

//

/************************************************************************/

// 1 - Faco a leitura da Base Nao modelada

/************************************************************************/

Base_Modelada:

LOAD * INLINE [

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

];

/************************************************************************/

// 2 - Descobrir qual e o menor Data por grupo por pessoa

// 

/************************************************************************/

Min_Data_Por_status:

LOAD

Min(Dia)  as  MinDtSituacaoPerDay,

Grupo,

Nome

Resident Base_Modelada

Where [Dias de Produção] = 1

Group By

Grupo,

Nome

;

/************************************************************************/

// 3 - Descobrir qual e o maior horario por Equipamento

//    e e por Status

/************************************************************************/

Max_Data_Por_status:

LOAD

Max(Dia)   as  MaxDtSituacaoPerDay,

Grupo,

Nome

Resident Base_Modelada

Where   [Dias de Produção] = 1

Group By

Grupo,

Nome

;

/************************************************************************/

// 4 -  Crio uma tabela somente com Status e ATM para fazer

//      a modelagem final

/************************************************************************/

BaseModeladaFinal:

NoConcatenate

LOAD Distinct

Nome,

Grupo

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

Nome,

Grupo,

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

Nome,

Grupo,

MaxDtSituacaoPerDay as DtFinalStatus

Resident Max_Data_Por_status

;

DROP Table  Max_Data_Por_status;

1 - Faco a leitura da Base Nao modelada

srchagas
Creator III
Creator III

Com as folgas ficaria assim

/************************************************************************/

// 1 - Faco a leitura da Base Nao modelada

/************************************************************************/

Base_Modelada:

LOAD * INLINE [

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

];

/************************************************************************/

// 2 - Descobrir qual e o menor Data por grupo por pessoa

// 

/************************************************************************/

Min_Data_Por_status:

LOAD

Min(Dia)  as  MinDtSituacaoPerDay,

Grupo,

Nome,

  [Dias de Produção]

Resident Base_Modelada

Group By

Grupo,

Nome,

[Dias de Produção]

;

/************************************************************************/

// 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 de Produção]

Resident Base_Modelada

Group By

Grupo,

Nome,

[Dias de Produção]

;

/************************************************************************/

// 4 -  Crio uma tabela somente com Status e ATM para fazer

//      a modelagem final

/************************************************************************/

BaseModeladaFinal:

NoConcatenate

LOAD Distinct

Nome,

Grupo

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

Nome,

Grupo,

   [Dias de Produção],

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

Nome,

Grupo,

   [Dias de Produção],

MaxDtSituacaoPerDay as DtFinalStatus

Resident Max_Data_Por_status

;

DROP Table  Max_Data_Por_status;

Ajustado:

LOAD

*,

if( len(Grupo) <  2 , 'Folga','Trabalhado') as Status

Resident BaseModeladaFinal;

DROP Table BaseModeladaFinal;

Anonymous
Not applicable
Author

Thiago,

Eu não entendi, onde no scrip ele vai estar diferenciando todas as vezes que mudar de grupo.

Meu scrip verdadeiro é esse:

[Geral]:

LOAD

    %MagistradoID,

    Dia,

    date(Dia,'DD/MM/YYYY') AS DT,

     "Dias Afastdo/Designado",

    "Dias Produtividade (Acumulado)",

    "Dias Produtividade";

FROM [Geral.qvd];

left Join

[Magistrados]:

LOAD

    %MagistradoID,

    "Matrícula (Magistrado)",

    "Sexo (Magistrado)",

    Magistrado

FROM [Magistrados.qvd]

(qvd);

left Join

[Magistrado-Orgao]:

LOAD

    %MagistradoID,

    Dia,

    "%Órgão JulgadorID",

    %FunçãoID

FROM Magistrado-Orgao.qvd]

(qvd);

left Join

[Orgao-Julgadores]:

LOAD

    "%Órgão JulgadorID",

    Instância,

    Entrância,

    "Região da Corregedoria",

    Comarca,

    "Órgão Julgador",

    "Tipo de Justiça",

    "Especialidade (Órgão Julgador)",

    "Natureza (Órgão Julgador)",

    Cluster,

    Porte,

    "Data de Início da Vigência",

    "Data de Fim da Vigência"

FROM [Orgaos-Julgadores.qvd]

(qvd);

E eu Preciso no Final uma tabela que me fale o Magistrado, Data de ínico e dia de Fim de trabalho, no Cluster e por Porte. Isso para todos os dias de trabalho, que são os dias de produtividade igual a 1. E caso haja uma folga no período, tem que ser interrompido. Como se começasse a contar de novo.

Ou seja, toda vez que mudar o Magistrado, ou o Cluster ou o Porte, ou fosse um dia de folga, teria que ser a data fim. Mesmo que fosse o mesmo Magistrado.

Conseguiu entender mais ou menos.

Como sou nova no qlik sense, ainda é um bastante complexo para mim.

Vou tentar ajustar seu scip.

Muito Obrigada!

srchagas
Creator III
Creator III

entao eu uso na verdade o Meu Max e min por dia, ele agrupado por Grupo vai pegar sempre

Menor data  + Grupo

se a pessoa muda de grupo vou pegar sisso, voce noa consegue me passa uma amostra de dados mais real ? com tudo, para que eu possa  monta pra ti melhor o codigo, pq teoricamente depois de fazer toda essa uniao ai  aplicaria meu script e calcularia , noa precisa ser muito registro so umas 10 a 15 linhas eu consigo fazer aqui rapidim