Aprenda PL/SQL

Clienes inativos

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Ter, 21 Fev 2017 1:22 pm

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:

Código: Selecionar todos
       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:
Código: Selecionar todos
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
gab26

Mensagemem Ter, 21 Fev 2017 4:59 pm

boa tarde,

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

Código: Selecionar todos
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'
spernega
Localização: São Paulo - SP

Mensagemem Ter, 21 Fev 2017 5:16 pm

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
gab26

Mensagemem Qua, 22 Fev 2017 7:51 am

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:

Código: Selecionar todos
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:

Código: Selecionar todos
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?
spernega
Localização: São Paulo - SP

Mensagemem Qua, 22 Fev 2017 9:13 am

Bom dia spernega

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

abraço
gab26



Voltar para SQL

Quem está online

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