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
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
Curtir tópico
+ 0
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
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
Clique aqui para fazer login e interagir na Comunidade :)