none
ajuda com consulta RRS feed

  • Pergunta

  • Pessoal,

    Na query abaixo, preciso retornar a penúltima compra dos clientes. Porém não está correto, pois a consulta retorna a primeira compra ao invés da penúltima.

    De forma isolada consigo retornar a ultima a penultima compra assim:

    select CODCFO,max(DATAEMISSAO) as ultcompra
    from TMOV where CODCFO = ''000675'' and CODTMV = ''2.2.01''
    group by CODCFO 

    select top 1 CODCFO,DATAEMISSAO as penultcompra from tmov where CODCFO = ''000675'' and CODTMV = ''2.2.01'' and dataemissao < 
    (select max(DATAEMISSAO) 
    from TMOV where CODCFO = ''000675'' and CODTMV = ''2.2.01''
    ) order by DATAEMISSAO desc


    Essa é a consulta:


    select * from (
    select *, datediff(day,penultcomp,ultcomp) as Dias from (
    select *,

    (select top 1 dataemissao from tmov t WITH (NOLOCK) where codtmv = ''2.2.01'' and 
    t.codcfo = TGERAL.codcfo and t.codven1 =''0001''
    and dataemissao < ultcomp) as penultcomp

    from (select * from (select f.codcfo,nome,
    (select max(dataemissao) as data from tmov t WITH (NOLOCK) where codtmv = ''2.2.01'' and 
    t.codcfo = f.codcfo and

    t.codven1 =''0001''

    group by t.codcfo) as ultcomp
    ,(select max(valorliquido) from tmov t WITH (NOLOCK) where codtmv = ''2.2.01'' and t.status <> ''C''
    and t.codcfo = f.codcfo and

    t.codven1 =''0001''


    group by t.codcfo) as valor
    ,(select max(t.codven1) from tmov t WITH (NOLOCK) where codtmv = ''2.2.01'' and t.status <> ''C''
    and t.codcfo = f.codcfo and

    t.codven1 =''0001''

    group by t.codcfo) as codven
    from fcfo f
    left join fcfodef fd (NOLOCK) on (f.codcfo = fd.codcfo)
    left join fcfocompl fc (NOLOCK) on (f.codcfo = fc.codcfo)
    where nome is not null and ativo = 1 and fc.cliforne = ''001''
    )T1)TGERAL)TAUX where datediff(day,penultcomp,ultcomp) >= 180)
    TULT where 

    codven =''0001''



    and ultcomp >= ''01/08/2012''
    and ultcomp <= ''31/08/2012''


    order by nome
    sábado, 1 de setembro de 2012 13:27

Respostas

  • Adner,

    Eu consegui resolver, mas para apenas um cliente. Preciso agora pegar a consulta abaixo sem passar o CODCFO que é o codigo do cliente. Ou seja, quero todos os CLIENTES por vendedor (CODVEN):

    select T1.CODCFO,f.nome,T1.ultcomp,T1.valor,T1.penultcomp, DATEDIFF(day,penultcomp,ultcomp) as dias from (
    select tm.CODCFO,MAX(DATAEMISSAO) as ultcomp,valor, penultcomp from TMOV tm inner join

    (select top 1 CODCFO,DATAEMISSAO as penultcomp from TMOV
     where CODTMV = '2.2.01' and CODCFO = '000675'
     and DATAEMISSAO < (select MAX(DATAEMISSAO) from TMOV
     where CODTMV = '2.2.01' and CODCFO = '000675'
     group by codcfo)
     order by DATAEMISSAO desc)T1 on (T1.CODCFO = tm.CODCFO)
     
     inner join
     
     (select top 1 CODCFO,VALORLIQUIDO as valor from TMOV
     where CODTMV = '2.2.01' and CODCFO = '000675'
     and DATAEMISSAO = (select MAX(DATAEMISSAO) from TMOV
     where CODTMV = '2.2.01' and CODCFO = '000675'
     group by codcfo)
     )T2 on (T2.CODCFO = tm.CODCFO)
     
     


     where CODTMV = '2.2.01' and tm.CODCFO = '000675'
     group by tm.codcfo,valor,penultcomp)T1
     
      inner join
      
      FCFO f on (f.CODCFO = T1.codcfo)
      
      where ultcomp >= '01/08/2012' and ultcomp <= '31/08/2012'
     
     
     

    • Editado romanvpp segunda-feira, 3 de setembro de 2012 21:30
    • Marcado como Resposta Ricardo Russo sexta-feira, 25 de janeiro de 2013 12:08
    segunda-feira, 3 de setembro de 2012 18:59

Todas as Respostas

  • Boa tarde Amigo,

    tente da seguinte maneira:

    SELECT TOP 1

    CODCFO,
    DATAEMISSAO AS PENULTIMACOMPRA
    FROM 
    TMOV
    WHERE
    CODCFO = '000675' AND
    CODTMV = '2.2.01' AND
    DATAEMISSAO < (SELECT TOP 1 DATAEMISSAO FROM TMOV WHERE CODCFO = '000675' AND CODTMV = '2.2.01' ORDER BY DATAEMISSAO DESC)
    ORDER BY
    DATAEMISSAO DESC

    essas tabelas me lembram bem o banco do RM da TOTVS rsrsrr.

    Até mais. Abraços

    • Sugerido como Resposta Douglas Turque segunda-feira, 3 de setembro de 2012 18:43
    segunda-feira, 3 de setembro de 2012 16:20
  • Fala Adner blz...

    Exatamente, isso é da RM.

    Cara eu não to conseguindo colocar o q vc fez na query. Não funciona.


    segunda-feira, 3 de setembro de 2012 18:58
  • Adner,

    Eu consegui resolver, mas para apenas um cliente. Preciso agora pegar a consulta abaixo sem passar o CODCFO que é o codigo do cliente. Ou seja, quero todos os CLIENTES por vendedor (CODVEN):

    select T1.CODCFO,f.nome,T1.ultcomp,T1.valor,T1.penultcomp, DATEDIFF(day,penultcomp,ultcomp) as dias from (
    select tm.CODCFO,MAX(DATAEMISSAO) as ultcomp,valor, penultcomp from TMOV tm inner join

    (select top 1 CODCFO,DATAEMISSAO as penultcomp from TMOV
     where CODTMV = '2.2.01' and CODCFO = '000675'
     and DATAEMISSAO < (select MAX(DATAEMISSAO) from TMOV
     where CODTMV = '2.2.01' and CODCFO = '000675'
     group by codcfo)
     order by DATAEMISSAO desc)T1 on (T1.CODCFO = tm.CODCFO)
     
     inner join
     
     (select top 1 CODCFO,VALORLIQUIDO as valor from TMOV
     where CODTMV = '2.2.01' and CODCFO = '000675'
     and DATAEMISSAO = (select MAX(DATAEMISSAO) from TMOV
     where CODTMV = '2.2.01' and CODCFO = '000675'
     group by codcfo)
     )T2 on (T2.CODCFO = tm.CODCFO)
     
     


     where CODTMV = '2.2.01' and tm.CODCFO = '000675'
     group by tm.codcfo,valor,penultcomp)T1
     
      inner join
      
      FCFO f on (f.CODCFO = T1.codcfo)
      
      where ultcomp >= '01/08/2012' and ultcomp <= '31/08/2012'
     
     
     

    • Editado romanvpp segunda-feira, 3 de setembro de 2012 21:30
    • Marcado como Resposta Ricardo Russo sexta-feira, 25 de janeiro de 2013 12:08
    segunda-feira, 3 de setembro de 2012 18:59