[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