Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
marcio150972
Creator
Creator

Expressão subtração dias de uma data conforme data selecionada

Pessoal,

Não estou conseguindo fazer na expressão do status do cliente um IF aplicando  umas regras de dias conforme data escolhida no filtro calendario.

Conforme for a data escolhida preciso aplicar as seguintes regras:

1) Data escolhida - 30 dias e pode ter comprado em outras datas inferiores = 'ATIVO' 


( exemplo: data escolhida: 28/09/2017: tem que verificar desde o dia 27/09/2017 ate 29/08/2017, se existir uma nota emitida   o status = 'ATIVO' , e assim segue para as demais regras abaixo


2) - 30 dias e não pode nunca ter comprado = 'NOVO'

3) > = 91 dias  = 'INATIVO'

4) > = 31 and  < = 90 = 'PRÉ-INATIVO'

5) >=  30 = 'REATIVADO'

6) nunca comprou = 'PROSPECT'

7) - 30 and > = 91 =  'REATIVADO'




Agradeço a ajuda



8 Replies
eduardo_dimperio
Specialist II
Specialist II

Oi Marcio, infelizmente nao consigo abrir teu codigo. Se puder postar ele eu dou uma olhada pra ti.

marcio150972
Creator
Creator
Author

Tudo bem Eduardo, muito obrigado meu amigo pela ajuda.

segue script:

[Status_Compra_clientes]:

load

   

   

    date(PED_DTFATU,'dd/MM/yyyy hh:mm:ss') as [Data Emissão Pedidos_SCC],

    date(PED_DTFATU,'dd/MM/yyyy') as [Data Emissão Pedidos s/ Hora_SCC],

    time(PED_DTFATU,'hh:mm:ss') as [Data Emissão Pedidos Hora_SCC],

    CLI_CODIGO as CLI_CODIGO_SCC,

  CLI_NOMECL as CLI_NOMECL_SCC,

  MER_DESCRI as MER_DESCRI_SCC,

  SEG_DESCRI as SEG_DESCRI_SCC,

  VEN_CODIGO as VEN_CODIGO_SCC,

  VEN_NOME as VEN_NOME_SCC,

  CLI_ESTADO as CLI_ESTADO_SCC;

 

  SELECT  DISTINCT  PED_DTFATU,

  p.CLI_CODIGO,

  c.CLI_NOMECL,

  MER_DESCRI,

  SEG_DESCRI,

  c.VEN_CODIGO,

  v.VEN_NOME,

  c.CLI_ESTADO

 

 

FROM CRM_PEDIDO  p

inner join  CRM_CLIENTE c

on c.CLI_CODIGO = p.CLI_CODIGO

FULL OUTER  JOIN  CRM_MERCADO M

on M.MER_CODIGO = c.MER_CODIGO

FULL OUTER  JOIN CRM_SEGMENTO S

on S.SEG_CODIGO = c.SEG_CODIGO

FULL OUTER  JOIN CRM_VENDEDOR v

on v.VEN_CODIGO = c.VEN_CODIGO

where EXTRACT(YEAR FROM PED_DTFATU) > 2014

and PST_STATUS in (2,4,0,1)

and  ped_tipo = 'VENDA'

and PED_DTFATU is not null;

 

[Calendario_Status_Compra_clientes]:

load distinct

date([Data Emissão Pedidos_SCC],'dd/MM/yyyy hh:mm:ss') as [Data Emissão Pedidos_SCC],

    date([Data Emissão Pedidos_SCC],'MM/yyyy') as [MesAno_SCC],

    year([Data Emissão Pedidos_SCC]) as [Ano Pedidos_SCC],

month([Data Emissão Pedidos_SCC]) as [Mês Pedidos_SCC],

day([Data Emissão Pedidos_SCC]) as [Dia Pedidos_SCC]

resident [Status_Compra_clientes] order by [Data Emissão Pedidos_SCC];

eduardo_dimperio
Specialist II
Specialist II

Bacana, entao pelo que eu entendi voce vai ter duas tabelas resultantes:

[Status_Compra_clientes]:

load

  

  

    [Data Emissão Pedidos_SCC],

    [Data Emissão Pedidos s/ Hora_SCC],

    [Data Emissão Pedidos Hora_SCC],

    CLI_CODIGO_SCC,

   CLI_NOMECL_SCC,

   MER_DESCRI_SCC,

  SEG_DESCRI_SCC,

   VEN_CODIGO_SCC,

  VEN_NOME_SCC,

   CLI_ESTADO_SCC;

LEFT JOIN ([Status_Compra_clientes])

  

[Calendario_Status_Compra_clientes]:

load distinct

[Data Emissão Pedidos_SCC],

   [MesAno_SCC],

  [Ano Pedidos_SCC],

[Mês Pedidos_SCC],

[Dia Pedidos_SCC]

[Data Emissão Pedidos_SCC];

INTERVALO:

LOAD

*,

INTERVAL(Today()- [Data Emissão Pedidos_SCC],'D') AS TEMPO_DA_COMPRA


RESIDENT [Status_Compra_clientes]:

FINAL:

LOAD

*,

IF(TEMPO_DA_COMPRA<30,'ATIVO',

IF(TEMPO_DA_COMPRA> = 91, 'INATIVO',

IF(TEMPO_DA_COMPRA> = 31 and  TEMPO_DA_COMPRA< = 90 , 'PRÉ-INATIVO',

IF(TEMPO_DA_COMPRA>=  30 ,'REATIVADO',

)

)

)

)

RESIDENT INTERVALO

Quanto ao estado Novo e Prospect, precisa validar junto se existe uma ultima data de compra com a atual.

Veja se isso te atende


rogerioalmeida
Creator
Creator

Marcio,

Tenta usar a combinação de IF com Set analisy, pode ser algo parecido com isso.

if(

Sum({$<[Ano Pedidos_SCC]=, [Mês Pedidos_SCC]=,

[Data Emissão Pedidos s/ Hora_SCC] =

{">=$(=max([Data Emissão Pedidos s/ Hora_SCC])-30) <=$(=max([Data Emissão Pedidos s/ Hora_SCC]))"}>}' CAMPO VALOR')

> 0,'ATIVO','INATIVO')

Pensei em fazer no script mais não sei se atenderia a sua demanda.

Aproveitando segue o calendário como faço, pode ser que ajude mais na frente, pois fazer calendário com a tabela FATO se não tiver FATO em algum dia ele não gera DATA.

DATA:

LOAD

DATE(today()+365-recno()+1) as DATA

autogenerate((today()+1095)- '2005-01-01');

Periodo:

LOAD

  YEAR(DATA)&MONTH(DATA)&Day(DATA) AS Chave_Periodo,

  Year(DATA)&Month(DATA) as Ch_Ano_Mês,

  YEAR(DATA) AS Ano,

  MONTH(DATA)&'/'&YEAR(DATA) AS [Mês/Ano],

  year(DATA)&'/'&num(MONTH(DATA),'00') as [Ano/Mês],

  MONTH(DATA) AS Mês,

  DAY(DATA) AS Dia,

  WEEK(DATA)&'-'&YEAR(DATA) AS [Semana Ano],

  WEEK(DATA) AS [Semana],

  WEEKDAY(DATA) AS [Dia Semana],

  'S'& CEIL(MONTH(DATA)/6) AS [Semestre],

  'T'& CEIL(MONTH(DATA)/3) AS [Trimestre],

  'B'& CEIL(MONTH(DATA)/2) AS [Bimestre],

  date#(DATA, 'DD/MM/YYYY')  as Data

RESIDENT DATA

WHERE DATA >='2005-01-01'

AND DATA <= DATE(Today(),'YYYY-MM-DD')

DROP TABLE DATA;

Espero ter ajudado

marcio150972
Creator
Creator
Author

Eduardo,

tudo bem meu amigo.

Entendi o processo.

Assim:

No meu caso vou ter na tela um calendário aonde o cliente vai escolher a data, ou seja, acredito que precise criar uma variavel para pegar essa data e colocar dentro do if, pois vai mudar, conforme ele escolher ano, mes e dia, entao nao sei se seria dentro do script, acredito que tenho que colocar na expressão, o que você acha?

No caso:

'NOVO':  comprou dentro dos 30 dias para trás da data escolhida mas não tem nenhum registro de compra no banco de dados, ou seja, foi a primeira compra dele.

'PROSPECT': nunca comprou, existe na tabela de clientes mas nunca comprou, não tem data de pedido faturada

eduardo_dimperio
Specialist II
Specialist II

Oi Marcio,

Nesse caso voce tem duas soluções, a primeira é fazer esse processo que eu te passei para todas as datas e na tela tu colocar um filtro com as datas pro cara escolher e outra é usar a solução do Francisco que utiliza Set Analisys, onde o filtro fica na propria tela.

marcio150972
Creator
Creator
Author

Ok Eduardo, muito obrigado.

Vou testar as 2 maneiras para ver o que fica melhor e ai marco aqui as respostas.

Agradeço a tua ajuda.

eduardo_dimperio
Specialist II
Specialist II

Tranquilo, o importante é te ajudar.

O set analisys eu acho mais bacana do ponto de vista de construção, menos codigo. O problema é a manutenção dele, se voce não conhece ficam mais complicadas as alterações.