Série da semana: Primeiros passos no Angular

Veja mais

SELECT EM TRÊS TABELAS COMPARANDO DATA

15/05/2019

9

Preciso criar um script que traga quantos clientes efetuaram algum pagamento após o atendimento e quantas não efetuaram nenhum pagamento, para fazer isso preciso comparar as datas de duas tabelas que não estão relacionadas entre si.

A tabela PRV_PARCELAS possui a data de pagamento que preciso comparar com a data de atendimento que esta na tabela PRV_ATENDIMENTOS, ambas as tabelas possuem relacionamento com a tabela PRV_VENDAS.

Fiz um select mas esta duplicando valores e não esta consistente, alguem consegue me ajudar??

select distinct b.Cod_Venda, a.Cod_Venda, b.Cod_Venda, a.Data_Atendimento, b.Data_Pagamento
from dbo.PRV_Atendimentos$ a, dbo.PRV_Parcelas$ b, dbo.PRV_Vendas$ c

where CONVERT(VARCHAR(10),a.Data_Atendimento,111) between '2017-05-01' and '2017-05-31'
and a.Cod_Venda = b.Cod_Venda
and a.Data_Atendimento <= b.Data_Pagamento
order by 2 desc ;
Responder

Posts

15/05/2019

Binoti

Pode ser a falta de relacionamento no where, tenta incluir campos que as tabelas tenham em comum, como número cliente ...
Responder

15/05/2019

Jorgelessa

Então o problema é que não existe relacionamento entre as tabelas PRV_PARCELAS e PRV_ATENDIMENTOS, ambas as tabelas possuem relacionamento com a tabela PRV_VENDAS onde a tabela PRV_PARCELAS possui o ID_CLIENTE e COD_VENDA e a tabela PRV_ATENDIMENTOS possui o COD_VENDA só.

Será que tem como filtrar as vendas comparando as vendas das PRV_PARCELAS x vendas da PRV_VENDAS e com o resultado verificar as vendas desse resultado que existe na PRV_ATENDIMENTOS e fazer uma comparação de data entre a PRV_PARCELAS(data_pagamento) X PRV_ATENDIMENTO(data_atendimento) e retornar a quantidade de vendas que foram pagas depois do atendimento?
Responder
tente com a instrução abaixo.
há campos que você não citou. isto foi só pra te dar um 'norte'.
select
	c.Cod_Venda, b.Num_Parcela, b.Data_Vencimeto, a.Data_Atendimento, b.Data_Pagamento
from
	dbo.PRV_Vendas$ c
inner join
	dbo.PRV_Parcelas$ b on b.ID_CLIENTE = c.ID_CLIENTE and b.COD_VENDA = c.COD_VENDA
	and ((b.Data_Pagamento is null and b.Data_Vencimento < GETDATE()) or (b.Data_Pagamento > b.Data_Vencimento)) -- parcelas vencidas ou pagas com atraso
left join
	dbo.PRV_Atendimentos$ a on a.Cod_Venda = b.Cod_Venda
	and a.Data_Atendimento > b.Data_Vencimento -- atendimento efetuado após o vencimento da parcela
	and (b.Data_Pagamento is null or a.Data_Atendimento <= b.Data_Pagamento) -- parcela ainda em aberto ou paga após o atendimento
where
	b.Data_Pagamento is null
	or CONVERT(VARCHAR(10),a.Data_Atendimento,111) between '2017-05-01' and '2017-05-31'
group by
	c.Cod_Venda, b.Num_Parcela, b.Data_Vencimeto, a.Data_Atendimento, b.Data_Pagamento
order by
	c.Cod_Venda desc

desta forma deverão ser apresentados todos os títulos vencidos (ainda em aberto) ou pagos depois do atendimento.
Responder