Ajuda - Select pegar o valor Correto

23/09/2003

0

Pessoal

Estou com o seguinte problema, necessito extrair informação em um banco de
dados muito grande, e preciso totalizar duas colunas de valores em tabelas
que possuem um relacionamento n para n. Ocorre que os valores que estão
sendo retornado pelo banco de dados apresenta duplicado.

Veja o exemplo das tabelas abaixo:

TABELA MNC
IDNC VRNC CDUF
100 500,00 SP
101 1000,00 SP
102 1500,00 SP

TABELA RCONNC
IDNCIDNOTA
100 1001
100 1002
100 1003
1011004
102 1004

TABELA MNOTA
IDNOTA VRNOTA
1001 60,00
1002 40,00
1003 20,00
1004 50,00

ABAIXO SEGUE O QUE SERIA O RESULTADO DE UM SELECT COM JOIN ENTRE AS TABELAS

UF IDNC IDNOTA VRNC VRNOTA
SP 100 1001 500,00 60,00
SP 100 1002 500,00 40,00
SP 100 1003 500,00 20,00
SP 101 1004 1000,00 50,00
SP 102 1004 1500,00 50,00


CONSIDERANDO O SQL ABAIXO

select MNC.CDUF,
SUM (MNC.VRNC),
SUM (MNOTA.VRNOTA)


FROM MNC,
RCONNC,
MNOTA,

WHERE MNOTA.IDNOTA = RCONNC.IDNOTA
AND RCONNC.IDNC = MNC.IDNC

Group by CDUF


Ao executar este comando o banco de dados retorna 4000 para a coluna
SUM(MNC.VRNC)
e 220 para a coluna SUM (MNOTA.VRNOTA), onde o correto seria retornar 3000
para a coluna SUM(MNC.VRNC)
e 170 para a coluna SUM (MNOTA.VRNOTA).

COMO MONTAR UM SQL , DE FORMA QUE ESTE RETORNE OS TOTAIS QUE REALMENTE
EXISTEM NAS TABELAS?

Este foi um exemplo simplificado para demonstrar o problema, o comando real
existe outros campos no group by quebras.

Sem abusar da boa vontade gostaria, se possível, uma solução que não
precisasse utilizar comandos PL/SQL pois este comando será utilizado em
vários banco de dados como Oracle, DB2 e SQL Server.
E que pudesse agrupar as linhas o Maximo possível, pois as tabelas
envolvidas possui mais de 2.000.000 de registros.

Obrigado a todos


Carlosantonio

Carlosantonio

Responder

Posts

24/09/2003

Motta

O problema é que o sql gera um produto cartesiano indevido, considerando que MNC.VRNC não precisa que sum tente

select MNC.CDUF,
MNC.VRNC,
SUM (MNOTA.VRNOTA)


FROM MNC,
RCONNC,
MNOTA,

WHERE MNOTA.IDNOTA = RCONNC.IDNOTA
AND RCONNC.IDNC = MNC.IDNC

Group by CDUF ,
MNC.VRNC


acho que é isto


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar