[firebase-br] Left Join com 3 Tabelas - Retorno Incorreto de Valores

Kleber Caneva kdcc em terra.com.br
Qua Fev 4 09:28:31 -03 2009


Como você disse a tabela MOVI_TERMIN_PRODS (MET) tem 1 registro, e tabela 
MOVIESTOQUE (ME) tem 2 registros.

O resultado de um Select usando Joins entre essa duas tabela será um produto 
dasa duas, nesse caso 2 (1 *2) registros.

Ao fazer o SUM do cmapo VALOR_UM, que está na primeira tabela ele somara o 
vlaro 3 do 1 registro com o 3 do registro duplicado.
Pra melhor visualizar isso, retire os SUMs e Group By e pode ver como ele 
retorna as informações, ai se vc somar a coluna VALOR_UM verá que o seu 
resultado também será 6.

As soluções para seu caso seriam:

- Colocar o cmapo VALOR_UM no Group by tirando o SUM dele.
- Substituir o SUM por MIN ou MAX

Espero ter ajudado mais do que complicado.

[]´s

Kléber Caneva


----- Original Message ----- 
From: "Valdir" <valdirdill em infolivre.com.br>
To: <lista em firebase.com.br>
Sent: Wednesday, February 04, 2009 9:04 AM
Subject: [firebase-br] Left Join com 3 Tabelas - Retorno Incorreto de 
Valores


Olá, preciso de ajuda sobre o que poderia estar errado na SQL abaixo.

A tabela MOVI_TERMIN_PRODS (MET) só tem um único lançamento e o campo
PRODUTO desse lançamento está igual a 2 e o campo VALOR_UM está igual a
3,00.
Já a tabela MOVIESTOQUE (ME) tem dois lançamentos com campo PRODUTO igual a
2 e, no campo VALOR_TRES desses lançamentos tem 4,00 e 8,00.
O campo SOMA_VALOR_TRES está retornando corretamente 12,00. Porém, o valor
de SOMA_VALOR_UM está retornando incorretamente 6,00, quando o correto seria
3,00.
Pelo que percebi, o valor 3,00 está sendo somando 2 vezes, ou seja, soma
tantas vezes quantos forem os lançamentos existentese na linha
"SUM(ME.VALOR_TRES*(CASE WHEN ME.PRODUTO = 2 THEN 1 ELSE 0 END)) AS
SOMA_VALOR_TRES", mas essa linha é relativa a tabela MOVIESTOQUE (ME),
enquanto que deveria somar somente os valores existente na tabela
MOVI_TERMIN_PRODS (MET) que tem apenas um lançamento com valor 3,00 no campo
VALOR_UM.

Por gentileza, se puder, analise a consulta e me retorne.

 CDSTeste.Close;
 SQLDSTeste.Close;
 SQLDSTeste.CommandText := 'SELECT  P.CODIGO,
  SUM(MET.VALOR_UM*(CASE WHEN TESTE.PRODUTO = 2 THEN 1 ELSE 0 END)) AS
SOMA_VALOR_UM,
  SUM(MET.VALOR_DOIS*(CASE WHEN TESTE.PRODUTO = 2 THEN 1 ELSE 0 END)) AS
SOMA_VALOR_DOIS,

  SUM(ME.VALOR_TRES*(CASE WHEN ME.PRODUTO = 2 THEN 1 ELSE 0 END)) AS
SOMA_VALOR_TRES,
  SUM(ME.VALOR_QUATRO*(CASE WHEN ME.PRODUTO = 2 THEN 1 ELSE 0 END)) AS
SOMA_VALOR_QUATRO

  FROM PRODUTOS P LEFT JOIN MOVI_TERMIN_PRODS TESTE ON (TESTE.PRODUTO =
P.CODIGO)
  LEFT JOIN MOVIESTOQUE ME ON (ME.PRODUTO = P.CODIGO) GROUP BY P.CODIGO ';
CDSTeste.Open;


Obrigado.
Valdir Dill





E-mail verificado pelo Terra Anti-Spam.
Para classificar esta mensagem como spam ou não spam, visite
http://mail.terra.com.br/cgi-bin/reportspam.cgi?+_d=SCY0NDU0NzM0I3Blcm0hdGVycmEmMSwxMjMzNzQ1NTUyLjQ2MDc5OS4yMzc3Ni5ib3ByZS50ZXJyYS5jb20sNTczMA==
Verifique periodicamente a pasta Spam para garantir que apenas mensagens
indesejadas sejam classificadas como Spam.



--------------------------------------------------------------------------------


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use: 
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa 





Mais detalhes sobre a lista de discussão lista