Filtrar clientes que nao fazem orcamentos em 6 meses

07/10/2019

10

Pessoal, Bom dia

Preciso fazer uma query de uma unica tabela de orcamentos onde pego todos os clientes que nao orçam a 6 meses atras. Esses clientes nao devem ter orçamentos a frente desse periodo. Alguem tem noção de como fazer isso. Porque nao estou conseguindo. Utilizando SQL SERVER

Obrigado pela ajuda.
Responder

Post mais votado

07/10/2019

deve ser algo assim:
SELECT 
  CLI.CLIENTE, CLI.NOME
FROM
  CLIENTES CLI
LEFT JOIN
  ORCAMENTOS ORC ON ORC.CLIENTE = CLI.CLIENTE
GROUP BY CLI.CLIENTE, CLI.NOME
HAVING MAX(COALESCE(ORC.DATA,0)) < (GETDATE() - 180)

Responder

Mais Posts

07/10/2019

Enock Junior

deve ser algo assim:
SELECT 
  CLI.CLIENTE, CLI.NOME
FROM
  CLIENTES CLI
LEFT JOIN
  ORCAMENTOS ORC ON ORC.CLIENTE = CLI.CLIENTE
GROUP BY CLI.CLIENTE, CLI.NOME
HAVING MAX(COALESCE(ORC.DATA,0)) < (GETDATE() - 180)

Emerson. o resultado esta ok, porem se eu filtro o codigo desse cliente ele nao deveria aparecer a frente dos 180 dias e o mesmo aparece. Esse esta sendo minha maior duvida. E quando vou no sistema e filtro por esse codigo, ele esta me trazendo ate a data de hoje e nao só ate os clientes que orçaram em -180 dias. Mas obrigado pela ajuda
Responder
apresente as instruções que você utilizou
Responder

07/10/2019

Enock Junior

deve ser algo assim:
SELECT 
  CLI.CLIENTE, CLI.NOME
FROM
  CLIENTES CLI
LEFT JOIN
  ORCAMENTOS ORC ON ORC.CLIENTE = CLI.CLIENTE
GROUP BY CLI.CLIENTE, CLI.NOME
HAVING MAX(COALESCE(ORC.DATA,0)) < (GETDATE() - 180)




SELECT DISTINCT
clientes.CodCliente, clientes.RazaoSocial, orc.NumOrcamento,ORC.EMail,ORC.Telefone, orc.DtEmissao
FROM
crm_clientes
left JOIN
ORC ON ORC.CodCliente = Clientes.CodCliente
GROUP BY clientes.CodCliente, clientes.RazaoSocial , orc.NumOrcamento, orc.DtEmissao, ORC.EMail, ORC.Telefone
HAVING MAX(COALESCE(orC.dtemissao,0)) < (GETDATE() -180)
order by orc.DtEmissao

resultado

59637 2019-04-10 00:00:00.000
59637 2019-04-10 00:00:00.000
60315 2019-04-10 00:00:00.000
61131 2019-04-10 00:00:00.000

Aqui ele me traz ok . O resultado esta ok, porem, quando eu filtro ele no sistema nao deveria vir orçamentos acima dessa data e aparece orçamentos de hoje. Minha intenção é saber quem nao fez orçamentos do mes 4 para frente
Responder
- não se trabalha com DISTINCT e GROUP BY na mesma instrução
- se você quer a última data, o campo que contém essa data não pode estar no GROUP BY e deve ser tratado por uma função de agregação
o correto seria algo assim:
SELECT
   c.CodCliente, c.RazaoSocial, orc.NumOrcamento, orc.EMail, orc.Telefone, max(orc.DtEmissao) UltEmissao
FROM
   crm_clientes c
LEFT JOIN
   ORC ON orc.CodCliente = c.CodCliente
GROUP BY
   c.CodCliente, c.RazaoSocial, orc.NumOrcamento, orc.EMail, orc.Telefone
HAVING
   MAX(COALESCE(orc.DtEmissao,0)) < (GETDATE() -180)

Responder
na verdade deveria ser como abaixo:
SELECT
   c.CodCliente, c.RazaoSocial, max(orc.NumOrcamento) NumOrcamento, max(orc.DtEmissao) UltEmissao
FROM
   crm_clientes c
LEFT JOIN
   ORC ON orc.CodCliente = c.CodCliente
GROUP BY
   c.CodCliente, c.RazaoSocial
HAVING
   MAX(COALESCE(orc.DtEmissao,0)) < (GETDATE() -180)
Responder

08/10/2019

Enock Junior

na verdade deveria ser como abaixo:
SELECT
   c.CodCliente, c.RazaoSocial, max(orc.NumOrcamento) NumOrcamento, max(orc.DtEmissao) UltEmissao
FROM
   crm_clientes c
LEFT JOIN
   ORC ON orc.CodCliente = c.CodCliente
GROUP BY
   c.CodCliente, c.RazaoSocial
HAVING
   MAX(COALESCE(orc.DtEmissao,0)) < (GETDATE() -180)
Obrigado.
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira