none
SELECT CLIENTES SEM COMPRAR RRS feed

  • 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 NomeCliente

    Ja 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.

      

    quarta-feira, 25 de fevereiro de 2015 21:06

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
    quarta-feira, 25 de fevereiro de 2015 21:26
  • 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
    quinta-feira, 26 de fevereiro de 2015 13:19

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
    quarta-feira, 25 de fevereiro de 2015 21:26
  • Obrigado pela resposta ,

    irei testar, so nao entendi esse cara

        ROW_NUMBER() OVER(PARTITION BY CLI.CODCLI ORDER BY P.DataPedido DESC) RN

    quinta-feira, 26 de fevereiro de 2015 12:53
  • 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
    quinta-feira, 26 de fevereiro de 2015 13:19
  •  Muito Agradecido,

     preciso estudar mais profundamente sobre Selects,

      Muito Obrigado, tanto uma quanto a outra , trouxeram resultados desejaveis,

    Grato

    quinta-feira, 26 de fevereiro de 2015 14:18