Clienes inativos

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
gab26
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Qua, 04 Jan 2017 11:01 am

Boa tarde,

estou com um problema que acredito que seja de lógica, preciso emitir um relatório de clientes inativos,

segue abaixo o código:

Selecionar tudo

       select n.agn_in_codigo, 
       g.agn_st_nome,
       max(n.not_dt_emissao),
       sum(n.not_re_valormercadoria),
       g.uf_st_sigla,
       t.tea_st_telefone,
       g.agn_st_municipio,
       g.tpl_st_sigla,
       g.agn_st_logradouro,
       g.agn_st_numero,
       g.agn_st_bairro

from mgven.ven_notafiscal n,
        mgglo.glo_agentes g,
        mgglo.glo_tel_agentes t


where n.agn_in_codigo = g.agn_in_codigo
         and t.agn_in_codigo = g.agn_in_codigo
         and n.not_dt_emissao <= '01-07-2016'
         and t.tea_st_tipo = 'Comercial'
         and n.agn_in_codigo <> all (3,103,2167,4)
      
      group by n.agn_in_codigo, 
               g.agn_st_nome,
               g.uf_st_sigla,
               t.tea_st_telefone,
               g.agn_st_municipio,
               g.tpl_st_sigla,
               g.agn_st_logradouro,
               g.agn_st_numero,
               g.agn_st_bairro
só que o problema esta aqui:

Selecionar tudo

and n.not_dt_emissao <= '01-07-2016'
essa linha me da as ultima notas emitidas antes desse período, mas eu tenho clientes que compraram recentemente, e que estão nessa lista, e é pra estar mesmo pois não estou falando EXCLUSIVAMENTE clientes que compraram abaixo dessa data, o problema é que não sei dizer isso para a linguagem, se alguém puder me ajudar agradeço muito.

valeu gente
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

boa tarde,

Não entendi bem a query, mas você terá que usar um not exist nela

Selecionar tudo

and    t.agn_in_codigo = g.agn_in_codigo
and    n.not_dt_emissao <= '01-07-2016'
--
and    not exist (select 1 from sua query traz os clientes com compra maior que 01-07-2016
--
and    t.tea_st_tipo = 'Comercial'
gab26
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Qua, 04 Jan 2017 11:01 am

spernega escreveu:boa tarde,

Não entendi bem a query, mas você terá que usar um not exist nela

and t.agn_in_codigo = g.agn_in_codigo
and n.not_dt_emissao <= '01-07-2016'
--
and not exist (select 1 from sua query traz os clientes com compra maior que 01-07-2016
--
and t.tea_st_tipo = 'Comercial'
boa tarde spernega

desculpe a pergunta mas qual parte você não entendeu?

eu não entendi nesse not exist, você faz um select para trazer os clientes com compras maior que 01-07-2016? porque eu quero que esses clientes que fizeram compras depois desse período não apareçam no select porque eles não estão inativos, não sei se eu entendi muito bem o que você quis dizer
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Bom dia gab26,

A minha falta de entendimento da query é basicamente por não conhecer a estrutura das tabelas.

mas vamos lá,

ven_notafiscal - tabela de notas fiscais
glo_agentes - tabela de clientes
glo_tel_agentes - tabela de meios de contato do cliente

certo?

A meu entendimento inicial é que fossem excluídos os clientes que tiveram compra acima da data de parâmetro de pesquisa, 01/07/2016.
Certo?

Eu trabalho com um sistema de Faturamento, erp, e mais um monte de funcionalidades.
Aqui também precisamos definir os clientes sem moviemento por diversas razões.

Aqui eu criei uma função que retorna a data da última compra do cliente.
Então a pesquisa que eu faço é mais ou menos assim:

Selecionar tudo

Select c.*
from   clientes c
where  fn_ultima_Compra(c.cod_clie) < to_date('01/07/2016','dd/mm/yyyy')
and    outras cláusulas, no seu caso and t.tea_st_tipo = 'Comercial' and n.agn_in_codigo <> all (3,103,2167,4)

Ou ainda no seu exemplo:

Selecionar tudo

select n.agn_in_codigo, 
       g.agn_st_nome,
       max(n.not_dt_emissao),
       sum(n.not_re_valormercadoria),
       g.uf_st_sigla,
       t.tea_st_telefone,
       g.agn_st_municipio,
       g.tpl_st_sigla,
       g.agn_st_logradouro,
       g.agn_st_numero,
       g.agn_st_bairro
from   mgven.ven_notafiscal n,
       mgglo.glo_agentes g,
       mgglo.glo_tel_agentes t
where  n.agn_in_codigo = g.agn_in_codigo
and    t.agn_in_codigo = g.agn_in_codigo
and    t.tea_st_tipo = 'Comercial'
and    n.agn_in_codigo <> all (3,103,2167,4)
group  by n.agn_in_codigo, 
          g.agn_st_nome,
          g.uf_st_sigla,
          t.tea_st_telefone,
          g.agn_st_municipio,
          g.tpl_st_sigla,
          g.agn_st_logradouro,
          g.agn_st_numero,
          g.agn_st_bairro
having max(n.not_dt_emissao) <= '01-07-2016'
Ajuda?
gab26
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Qua, 04 Jan 2017 11:01 am

Bom dia spernega

cara ajuda e muito, essa função que não sabia o Having max, muito obrigado mesmo.

abraço
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes