Array
(
)

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

Sergio Santos
   - 15 out 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.

Alan Marcel
|
MVP
    15 out 2014

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!

Marisiana
   - 16 out 2014

Nesse caso você precisa utilizar a função SUM para totalizar os valores:
#Código

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.

Sergio Santos
   - 16 out 2014

Marisiana

Citação:
Nesse caso você precisa utilizar a função SUM para totalizar os valores:
#Código

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.

Marisiana
   - 16 out 2014

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
#Código

 
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:
#Código
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...

Marisiana
   - 25 out 2014

Sergio, esse último exemplo funcionou?