Como Inibir um campo numa SELECT / LEFT JOIN para que ele não se REPITA

15/10/2014

Caros colegas do forum.

Estou com um problema em um relacionamento de tabelas no SQL e gostaria de uma ajuda.

Fiz um relacionamento entre 2 tabelas. VENDAS x FORMA_PAGTO

Os campos da tbl VENDAS são :

IDNOTA, DATA, VALOR_TOTAL_VENDA

Os seus dados para Exemplo são,
120036, 15-10-14, 100,00
120057, 15-10-14,310,00


Os campos da tbl FORMA_PAGTO são:

IDFPAGTO, IDNOTA, COD_FORMA_PAGTO, VALOR_PAGTO


Os dados são

1, 120036,1,50,00
2, 120036,4,50,00
3, 120057,1,101,00
4, 120057,3,105,00
5, 120057,6,104,00

--

Fiz o seguinte select

Select IDNOTA, DATA, VALOR_TOTAL_VENDA, COD_FORMA_PAGTO, VALOR_PAGTO from VENDAS VE
LEFT JOIN FORMA_PAGTO FP on VE.IDNOTA = FP.IDNOTA

E o resultado veio

IDNOTA, DATA, VALOR_TOTAL_VENDA, COD_FORMA_PAGTO, VALOR_PAGTO
120036, 15-10-14, 100,00, 1, 50,00
120036, 15-10-14, 100,00, 2, 50,00
120057, 15-10-14, 310,00, 1, 101,00
120057, 15-10-14, 310,00, 3, 105,00
120057, 15-10-14, 310,00, 6, 104,00

No requisito que tenho que atender para um relatório, Eu preciso Somar os valores do Campo NOTA, assim como os Valores das Parcelas efetuadas pela Forma de Pagamento, sendo que o PROBLEMA é que o campo VALOR_TOTAL_VENDA se repete nesta consulta.

Há alguma maneira para que o valor do campo VALOR_TOTAL_VENDA não se repita a partir da 2a. ocorrencia da SELECT ? ou
Teria como refazer o SQL para que este Requisito fosse atendido, Talvez com o uso de um UNION por Exemplo?

Desde já agradeço a ajuda.

Sergio Santos

Respostas

15/10/2014

Alan Marcel Currículo

O que vc acha de utilizar o SELECT DISTINCT ?

Select DISTINCT IDNOTA, DATA, VALOR_TOTAL_VENDA, COD_FORMA_PAGTO, VALOR_PAGTO from VENDAS VE
LEFT JOIN FORMA_PAGTO FP on VE.IDNOTA = FP.IDNOTA

Abraços!
Responder Citar

16/10/2014

Marisiana

Nesse caso você precisa utilizar a função SUM para totalizar os valores:
select ve.data,
          SUM(ve.valor_total_venda) as valor_total_venda,
         SUM(fp.valor_pagto) as valor_pgto
from vendas ve
left join forma_pgto fp 
on ve.idnota = fp.idnota
group by ve.data;

Não pode incluir no select os campos que são os ID dos registros nas tabelas, pois, como eles são distintos, eles irão impedir o agrupamento das informações.
Responder Citar

16/10/2014

Sergio Santos

Marisiana
Nesse caso você precisa utilizar a função SUM para totalizar os valores:
select ve.data,
          SUM(ve.valor_total_venda) as valor_total_venda,
         SUM(fp.valor_pagto) as valor_pgto
from vendas ve
left join forma_pgto fp 
on ve.idnota = fp.idnota
group by ve.data;
Não pode incluir no select os campos que são os ID dos registros nas tabelas, pois, como eles são distintos, eles irão impedir o agrupamento das informações.

A idéia no próximo passo será fazer o agrupamento, usando o SUM. A questão é que ao fazer o somatório de campo VALOR_TOTAL_VENDA, ele irá dobrar, se houverem 2 registro em FORMAS_PAGTO, e isto distorcerá o somatorio do total das Notas.
Responder Citar

16/10/2014

Marisiana

Ah tá... não me dei conta disso...
Você tem que deixar o IDNOTA e incluir ele no agrupamento e, considerando que na tabela VENDA só é armazenado um registro por nota, não somar o total da venda
 
select ve.idnota, 
          ve.data,
          ve.valor_total_venda as valor_total_venda,
         SUM(fp.valor_pagto) as valor_pgto
from vendas ve
left join forma_pgto fp 
on ve.idnota = fp.idnota
group by  ve.idnota,
                ve.data,
                ve.valor_total_venda;

Logicamente o retorno deve ser esse:
IDNOTA, DATA, VALOR_TOTAL_VENDA, VALOR_PAGTO 
120036, 15-10-14, 100,00, 100,00
120057, 15-10-14, 310,00, 310,00


Testa pra ver se tá certo...
Responder Citar

25/10/2014

Marisiana

Sergio, esse último exemplo funcionou?
Responder Citar