Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

victorpavia

[Resolvido] consulta

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Algo assim ..

 

...
from tmov t1 ...
where CODCFO,DATAEMISSAO = (select top 1 CODCFO,DATAEMISSAO  
                           from tmov t2
                           where t2.CODCFO = t1.CODCFO
                           and t2.CODTMV = t1.CODTMV 
                           and dataemissao < (select max(DATAEMISSAO) 
                                              from TMOV t3
                                              where t3.CODCFO = t1.CODCFO 
                                              and t3.CODTMV = t1.CODTMV 
and t1.CODCFO = ''000675'' 
and t1.CODTMV = ''2.2.01''
...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Algo assim ..

 

...
from tmov t1 ...
where CODCFO,DATAEMISSAO = (select top 1 CODCFO,DATAEMISSAO  
                           from tmov t2
                           where t2.CODCFO = t1.CODCFO
                           and t2.CODTMV = t1.CODTMV 
                           and dataemissao < (select max(DATAEMISSAO) 
                                              from TMOV t3
                                              where t3.CODCFO = t1.CODCFO 
                                              and t3.CODTMV = t1.CODTMV 
and t1.CODCFO = ''000675'' 
and t1.CODTMV = ''2.2.01''
...

 

Motta,

 

Me da uma ajuda cara. Como juntar essas duas consultas:

 

--penúltima compra

select top 1 codcfo,MAX(dataemissao) from TMOV where codcfo = '000675' and DATAEMISSAO < (

select MAX(DATAEMISSAO) from TMOV where codtmv = '2.2.01' and CODCFO = '000675' group by codcfo

) group by codcfo

 

--última compra

select MAX(tm.DATAEMISSAO) from TMOV tm where tm.codtmv = '2.2.01' and tm.CODCFO = '000675' group by tm.codcfo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais fácil fazer o join com esta subquery que passei ...

 

from tmov t1 ...
where (CODCFO,DATAEMISSAO) = (select top 1 CODCFO,DATAEMISSAO  
                             from tmov t2
                             where t2.CODCFO = t1.CODCFO
                             and t2.CODTMV = t1.CODTMV 
                             and dataemissao < (select max(DATAEMISSAO) 
                                                from TMOV t3
                                                where t3.CODCFO = t1.CODCFO 
                                                and t3.CODTMV = t1.CODTMV 
and t1.CODCFO = ''000675'' 
and t1.CODTMV = ''2.2.01''

 

Faça os joins devidos com tmov, pois esta já retorna o que se quer (penúltima compra).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais fácil fazer o join com esta subquery que passei ...

 

from tmov t1 ...
where (CODCFO,DATAEMISSAO) = (select top 1 CODCFO,DATAEMISSAO  
                             from tmov t2
                             where t2.CODCFO = t1.CODCFO
                             and t2.CODTMV = t1.CODTMV 
                             and dataemissao < (select max(DATAEMISSAO) 
                                                from TMOV t3
                                                where t3.CODCFO = t1.CODCFO 
                                                and t3.CODTMV = t1.CODTMV 
and t1.CODCFO = ''000675'' 
and t1.CODTMV = ''2.2.01''

 

Faça os joins devidos com tmov, pois esta já retorna o que se quer (penúltima compra).

 

A consulta retornou um erro:

 

Msg 4145, Level 15, State 1, Line 2

Uma expressão de tipo não booleano especificada em um contexto no qual se espera uma condição, próximo a ','.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Publica sua query toda ou me manda por MP.

 

Então essa é a query:

 

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

 

Motta,

 

Essa query é a ultima compra do cliente (CODCFO é o codigo do cliente).

 

select CODCFO,MAX(DATAEMISSAO) as ultcompra from TMOV (tabela de movimentos)

where CODTMV = '2.2.01' and CODCFO = '000675'

group by codcfo

 

Gostaria de pegar essa query com a query da penúltima compra e retornar em apenas uma linha.

Preciso da ultima e penultima compras do cliente.

 

Se der pra juntar isso:

 

ULTIMA COMPRA

select CODCFO,MAX(DATAEMISSAO) as ultcompra from TMOV

where CODTMV = '2.2.01' and CODCFO = '000675'

group by codcfo

 

PENULTIMA COMPRA

select top 1 CODCFO,DATAEMISSAO as penultimacompra 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

 

Motta,

 

 

Consegui fazer assim:

 

select T1.CODCFO,f.nome,T1.ultcomp,T1.penultcomp, DATEDIFF(day,penultcomp,ultcomp) as dias from (

select tm.CODCFO,MAX(DATAEMISSAO) as ultcomp, 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)

 

 

 

where CODTMV = '2.2.01' and tm.CODCFO = '000675'

group by tm.codcfo,penultcomp)T1

 

inner join

 

FCFO f on (f.CODCFO = T1.codcfo)

 

Só falta acrescentar o valor da ultima compra que também esta na tabela tmov. Poderia me ajudar com essa query?

Compartilhar este post


Link para o post
Compartilhar em outros sites

1º Tô meio enrolado aqui hoje e esta query não é simples

2º Ela não esta identada o que piora as coisas.

 

Tente :

Partir do zero

Pegar as duas compras maiores que a data da penultima

 

Tentar montar um join com estas query (tente melhorar está confusa)

Compartilhar este post


Link para o post
Compartilhar em outros sites

1º Tô meio enrolado aqui hoje e esta query não é simples

2º Ela não esta identada o que piora as coisas.

 

Tente :

Partir do zero

Pegar as duas compras maiores que a data da penultima

 

Tentar montar um join com estas query (tente melhorar está confusa)

 

 

Tem razão Motta. Abaixo eu consegui montar a query, mas passando o CODCFO(codigo do cliente) como parâmetro. Veja abaixo a query e depois o resultado:

 

 
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' 

 

REsultado:

 

codcli	Nome	Data Últ Compra	valor	Data Penult.Compra	Diferença em dias
000675	Assoc. Mor. Propr. Cond. Vilagio da Serra 	2012-08-17 00:00:00.000	387.2500	2012-07-26 00:00:00.000	22

 

Isso pra um cliente, preciso que seja para todos.

 

Obrigado e desculpe pela confusão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolveu ?

 

Dica : Use a tag CODE <>, fica melhor para códigos como o SQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolveu ?

 

Dica : Use a tag CODE <>, fica melhor para códigos como o SQL.

 

Motta,

 

Desculpe minha falta de experiência.

Então cara eu consegui fazer funcionar para um cliente específico. Preciso que essa consulta seja para todos os clientes ou seja sem passar o CODCFO(codigo do cliente) como parâmetro. Não estou conseguindo fazer isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

testa este, só tirei os and CODCFO = '000675'

 

 

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 DATAEMISSAO < (select MAX(DATAEMISSAO) from TMOV
where CODTMV = '2.2.01'  
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 DATAEMISSAO = (select MAX(DATAEMISSAO) from TMOV
where CODTMV = '2.2.01'  
group by codcfo)
) T2 on (T2.CODCFO = tm.CODCFO)




where CODTMV = '2.2.01' and tm.CODCFO = T2.CODCFO 
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' 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tinha feito isso mas retornou o seguite:

 

A subconsulta retornou mais de 1 valor. Isso não é permitido quando a subconsulta segue um =, !=, <, <= , >, >= ou quando ela é usada como uma expressão.

 

Fala MOtta,

 

Consegui resolver cara da uma olhada:

 

select *, DATEDIFF(DAY,penultcompra,ultcompra) AS dias from (
       select tm.codcfo,f.nome,codven1,
       (select MAX(DATAEMISSAO) from TMOV as t1 WITH (NOLOCK)
       where CODTMV = '2.2.01' and t1.CODCFO = tm.CODCFO
       and DATAEMISSAO < (select MAX(DATAEMISSAO) from TMOV WITH (NOLOCK) where CODTMV = '2.2.01' and CODCFO = tm.codcfo)) as penultcompra
       ,(select MAX(DATAEMISSAO) from TMOV t2 WITH (NOLOCK) where CODTMV = '2.2.01' and t2.CODCFO = tm.CODCFO) as ultcompra
       ,(select max(valorliquido) from TMOV t3 WITH (NOLOCK) where CODTMV = '2.2.01' and t3.CODCFO = tm.CODCFO
       and DATAEMISSAO =(select MAX(DATAEMISSAO) from TMOV t2 WITH (NOLOCK) where CODTMV = '2.2.01' and t2.CODCFO = tm.CODCFO))as valor
       from tmov tm WITH (NOLOCK) inner join FCFO f on (f.CODCFO = tm.CODCFO)
       where codtmv = '2.2.01'
       group by tm.CODCFO,f.nome,codven1)T1
       WHERE ultcompra >= '01/08/2012'
       and ultcompra <= '31/08/2012'
       and CODVEN1 = '0001'

       order by nome

 

Valew brother.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.