Usuário com melhor resposta
SELECT CLIENTES SEM COMPRAR

Pergunta
-
Boa tarde a todos,
Tenho um cenário onde preciso mostrar no relatório as seguintes opçoes:
Clientes que nao tiveram pedidos de acodo com um numero de dias (Paramentro)
ai preciso mostrar a ultima compra dele e o nro de dias que ele nao compra na empresa;
e outro relatorio onde tenho que mostrar os clientes que nunca compraram;
Partindo do seguinte modelo :
SELECT
MIN(CLI.CODCLI) Cliente,
MIN(CLI.NOMCLI) NomeCliente,
MIN(CLI.DDDCli)+'-'+MIN(CLI.FonCli) Fone,
MIN(CID.NOMCID) CIDADE
FROM
PEDIDOS P
JOIN EQCLID CLI ON P.CODCLIENTE = CLI.CODCLI
JOIN CIDADES CID ON CLI.CODCID = CID.CODCID
WHERE
DataPedido <= dateadd(day, -60, convert(varchar(10),getdate(),120))AND
CLI.SITCLI = 0 AND
CID.ESTCID like '%'
GROUP BY P.CODCLIENTE
ORDER BY NomeClienteJa tenho os clientes , mas seria a melhor opção?
como jogar data do ultimo pedido , nro de dias e o valor do ultimo pedido?
Desde ja Grato a todos.
Respostas
-
Boa tarde,
Para o primeiro relatório experimente mais ou menos dessa forma:
with CTE_RN as ( SELECT CLI.CODCLI Cliente, CLI.NOMCLI NomeCliente, CLI.DDDCli + '-' + CLI.FonCli Fone, CID.NOMCID CIDADE, P.NROPEDIDO, P.DATAPEDIDO, P.VALORPEDIDO, ROW_NUMBER() OVER(PARTITION BY CLI.CODCLI ORDER BY P.DataPedido DESC) RN FROM EQCLID CLI INNER JOIN CIDADES CID ON CID.CODCID = CLI.CODCID INNER JOIN PEDIDOS P ON P.CODCLIENTE = CLI.CODCLI WHERE CLI.SITCLI = 0 AND CID.ESTCID like '%' ) SELECT *, DATEDIFF(DAY, DataPedido, getdate()) NroDias FROM CTE_RN WHERE RN = 1 AND DataPedido <= dateadd(day, -60, getdate()) ORDER BY NomeCliente
E para o outro (clientes que nunca compraram):
SELECT CLI.CODCLI Cliente, CLI.NOMCLI NomeCliente, CLI.DDDCli + '-' + CLI.FonCli Fone, CID.NOMCID CIDADE FROM EQCLID CLI INNER JOIN CIDADES CID ON CLI.CODCID = CID.CODCID WHERE CLI.SITCLI = 0 AND CID.ESTCID like '%' AND NOT EXISTS (SELECT 1 FROM PEDIDOS P WHERE P.CODCLIENTE = CLI.CODCLI) ORDER BY NomeCliente
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Decio Morais Neto quarta-feira, 25 de fevereiro de 2015 21:41
-
Row_Number é uma função de classificação que foi utilizada para obter o último pedido (maior DataPedido) de cada cliente. Confira a página abaixo sobre as funções de classificação:
https://msdn.microsoft.com/pt-br/library/ms189798.aspx
Mas revendo a consulta, acredito que também seja possível obter o resultado desejado, e talvez com melhor desempenho, utilizando Cross Apply:
SELECT CLI.CODCLI Cliente, CLI.NOMCLI NomeCliente, CLI.DDDCli + '-' + CLI.FonCli Fone, CID.NOMCID CIDADE, P.NROPEDIDO, P.DATAPEDIDO, DATEDIFF(DAY, P.DataPedido, getdate()) NroDias, P.VALORPEDIDO FROM EQCLID CLI INNER JOIN CIDADES CID ON CID.CODCID = CLI.CODCID CROSS APPLY ( SELECT TOP 1 S.NROPEDIDO, S.DATAPEDIDO, S.VALORPEDIDO FROM PEDIDOS S WHERE S.CODCLIENTE = CLI.CODCLI ORDER BY S.DATAPEDIDO DESC ) P WHERE CLI.SITCLI = 0 AND CID.ESTCID like '%' P.DataPedido <= dateadd(day, -60, getdate()) ORDER BY NomeCliente
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Decio Morais Neto quinta-feira, 26 de fevereiro de 2015 14:18
Todas as Respostas
-
Boa tarde,
Para o primeiro relatório experimente mais ou menos dessa forma:
with CTE_RN as ( SELECT CLI.CODCLI Cliente, CLI.NOMCLI NomeCliente, CLI.DDDCli + '-' + CLI.FonCli Fone, CID.NOMCID CIDADE, P.NROPEDIDO, P.DATAPEDIDO, P.VALORPEDIDO, ROW_NUMBER() OVER(PARTITION BY CLI.CODCLI ORDER BY P.DataPedido DESC) RN FROM EQCLID CLI INNER JOIN CIDADES CID ON CID.CODCID = CLI.CODCID INNER JOIN PEDIDOS P ON P.CODCLIENTE = CLI.CODCLI WHERE CLI.SITCLI = 0 AND CID.ESTCID like '%' ) SELECT *, DATEDIFF(DAY, DataPedido, getdate()) NroDias FROM CTE_RN WHERE RN = 1 AND DataPedido <= dateadd(day, -60, getdate()) ORDER BY NomeCliente
E para o outro (clientes que nunca compraram):
SELECT CLI.CODCLI Cliente, CLI.NOMCLI NomeCliente, CLI.DDDCli + '-' + CLI.FonCli Fone, CID.NOMCID CIDADE FROM EQCLID CLI INNER JOIN CIDADES CID ON CLI.CODCID = CID.CODCID WHERE CLI.SITCLI = 0 AND CID.ESTCID like '%' AND NOT EXISTS (SELECT 1 FROM PEDIDOS P WHERE P.CODCLIENTE = CLI.CODCLI) ORDER BY NomeCliente
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Decio Morais Neto quarta-feira, 25 de fevereiro de 2015 21:41
-
-
Row_Number é uma função de classificação que foi utilizada para obter o último pedido (maior DataPedido) de cada cliente. Confira a página abaixo sobre as funções de classificação:
https://msdn.microsoft.com/pt-br/library/ms189798.aspx
Mas revendo a consulta, acredito que também seja possível obter o resultado desejado, e talvez com melhor desempenho, utilizando Cross Apply:
SELECT CLI.CODCLI Cliente, CLI.NOMCLI NomeCliente, CLI.DDDCli + '-' + CLI.FonCli Fone, CID.NOMCID CIDADE, P.NROPEDIDO, P.DATAPEDIDO, DATEDIFF(DAY, P.DataPedido, getdate()) NroDias, P.VALORPEDIDO FROM EQCLID CLI INNER JOIN CIDADES CID ON CID.CODCID = CLI.CODCID CROSS APPLY ( SELECT TOP 1 S.NROPEDIDO, S.DATAPEDIDO, S.VALORPEDIDO FROM PEDIDOS S WHERE S.CODCLIENTE = CLI.CODCLI ORDER BY S.DATAPEDIDO DESC ) P WHERE CLI.SITCLI = 0 AND CID.ESTCID like '%' P.DataPedido <= dateadd(day, -60, getdate()) ORDER BY NomeCliente
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Decio Morais Neto quinta-feira, 26 de fevereiro de 2015 14:18
-