Select com sum entre 2 tabelas ?
Ola caros amigos,
Tenho que fazer um select entre duas tabelas
CFOP e ICMS
quero retornar a soma de campos em cada dabela exemplo
CFOP.VALOR_BASE | ICMS.VALOR_OUTRAS
200,00 130,00
150,00 80,00
000,00 120,00
quero retornar o valor desta forma
CFOP.VALOR_BASE | ICMS.VALOR_OUTRAS
350,00 330,00
o problema e que na tabela CFOP.VALOR BASE ESTA duplicando os valores pois teve 3 ocorrencias na tabela ICMS
Estou lincando uma na outra via código de CFOP.
Uso Firebird 1.5
Desde já agradeço
Hugo Fabrício
Tenho que fazer um select entre duas tabelas
CFOP e ICMS
quero retornar a soma de campos em cada dabela exemplo
CFOP.VALOR_BASE | ICMS.VALOR_OUTRAS
200,00 130,00
150,00 80,00
000,00 120,00
quero retornar o valor desta forma
CFOP.VALOR_BASE | ICMS.VALOR_OUTRAS
350,00 330,00
o problema e que na tabela CFOP.VALOR BASE ESTA duplicando os valores pois teve 3 ocorrencias na tabela ICMS
Estou lincando uma na outra via código de CFOP.
Uso Firebird 1.5
Desde já agradeço
Hugo Fabrício
Hugofab
Curtidas 0
Respostas
Thomaz_prg
05/06/2006
Poste a estrutura destas 2 tabelas para ficar mais fácil ajudar.
GOSTEI 0
Hugofab
05/06/2006
Tenho duas tabelas: ENTRADA_CFOP (ECF) e ENTRADA_ICMS (EIC), sendo que a tabela ECF é mestre da tabela EIC. Na tabela ECF, tenho um registro que possui quatro correspondentes na tabela EIC, observe:
TABELA ENTRADA_CFOP:
CD_ENTRADA = 110
CFOP = 3550
TOTAL_NOTA _CFOP = 100
OUTRAS = 10
TABELA ENTRADA_ICMS:
CD_ENTRADA = 110
CFOP = 3050
BASE_ICMS = 25
VALOR_ICMS = 3
CD_ENTRADA = 110
CFOP = 3050
BASE_ICMS = 25
VALOR_ICMS = 3,25
CD_ENTRADA = 110
CFOP = 3050
BASE_ICMS = 25
VALOR_ICMS = 3,50
CD_ENTRADA = 110
CFOP = 3050
BASE_ICMS = 25
VALOR_ICMS = 3,75
Estou utilizando a seguinte sentença SQL:
Select ECF.CFOP, Sum(ECF.TOTAL_NOTA_CFOP) As TOTAL_NOTA_CFOP, Sum(ECF.OUTRAS) As OUTRAS, Sum(EIC.BASE_ICMS) As BASE_ICMS, Sum(EIC.VALOR_ICMS) As VALOR_ICMS
From ENTRADA_CFOP ECF Inner Join ENTRADA_ICMS EIC On (EIC.CFOP = ECF.CFOP) And (EIC.CD_ENTRADA = ECF.CD_ENTRADA)
Group By ECF.CFOP
Order By ECF.CFOP
Estou obtendo o seguinte resultado:
CFOP = 3050
TOTAL_NOTA_CFOP = 400
OUTRAS = 40
BASE_ICMS = 100
VALOR_ICMS = 13,50
Observe que os campos da tabela ECF (TOTAL_NOTA_CFOP e OUTRAS) foram quadruplicados!
Tenho q obter a seguinte resultado:
CFOP = 3050
TOTAL_NOTA_CFOP = 100
OUTRAS = 10
BASE_ICMS = 100
VALOR_ICMS = 13,50
Como posso fazer isso?
Atenciosamente,
TABELA ENTRADA_CFOP:
CD_ENTRADA = 110
CFOP = 3550
TOTAL_NOTA _CFOP = 100
OUTRAS = 10
TABELA ENTRADA_ICMS:
CD_ENTRADA = 110
CFOP = 3050
BASE_ICMS = 25
VALOR_ICMS = 3
CD_ENTRADA = 110
CFOP = 3050
BASE_ICMS = 25
VALOR_ICMS = 3,25
CD_ENTRADA = 110
CFOP = 3050
BASE_ICMS = 25
VALOR_ICMS = 3,50
CD_ENTRADA = 110
CFOP = 3050
BASE_ICMS = 25
VALOR_ICMS = 3,75
Estou utilizando a seguinte sentença SQL:
Select ECF.CFOP, Sum(ECF.TOTAL_NOTA_CFOP) As TOTAL_NOTA_CFOP, Sum(ECF.OUTRAS) As OUTRAS, Sum(EIC.BASE_ICMS) As BASE_ICMS, Sum(EIC.VALOR_ICMS) As VALOR_ICMS
From ENTRADA_CFOP ECF Inner Join ENTRADA_ICMS EIC On (EIC.CFOP = ECF.CFOP) And (EIC.CD_ENTRADA = ECF.CD_ENTRADA)
Group By ECF.CFOP
Order By ECF.CFOP
Estou obtendo o seguinte resultado:
CFOP = 3050
TOTAL_NOTA_CFOP = 400
OUTRAS = 40
BASE_ICMS = 100
VALOR_ICMS = 13,50
Observe que os campos da tabela ECF (TOTAL_NOTA_CFOP e OUTRAS) foram quadruplicados!
Tenho q obter a seguinte resultado:
CFOP = 3050
TOTAL_NOTA_CFOP = 100
OUTRAS = 10
BASE_ICMS = 100
VALOR_ICMS = 13,50
Como posso fazer isso?
Atenciosamente,
GOSTEI 0
Thomaz_prg
05/06/2006
dá pra fazer usando subselect´s:
Isso deve resolver.
Select ECF.CFOP, Sum(ECF.TOTAL_NOTA_CFOP) As TOTAL_NOTA_CFOP, Sum(ECF.OUTRAS) As OUTRAS, ( SELECT Sum(EIC.BASE_ICMS) FROM ENTRADA_ICMS EIC WHERE IC.CFOP = ECF.CFOP AND EIC.CD_ENTRADA = ECF.CD_ENTRADA ) As BASE_ICMS, ( SELECT Sum(EIC.VALOR_ICMS) FROM ENTRADA_ICMS EIC WHERE IC.CFOP = ECF.CFOP AND EIC.CD_ENTRADA = ECF.CD_ENTRADA ) As VALOR_ICMS From ENTRADA_CFOP ECF Group By ECF.CFOP Order By ECF.CFOP
Isso deve resolver.
GOSTEI 0
Hugofab
05/06/2006
Fiz algumas modificações em sua sentença SQL e ficou do seguinte modo:
Select
ECF.CFOP,
Sum(ECF.TOTAL_NOTA_CFOP) As TOTAL_NOTA_CFOP,
Sum(ECF.OUTRAS) As OUTRAS,
( SELECT
Sum(EIC.BASE_ICMS)
FROM ENTRADA_ICMS EIC, ENTRADA_CFOP ECF
WHERE
EIC.CFOP = ECF.CFOP AND
EIC.CD_ENTRADA = ECF.CD_ENTRADA
) As BASE_ICMS,
( SELECT
Sum(EIC.VALOR_ICMS)
FROM ENTRADA_ICMS EIC, ENTRADA_CFOP ECF
WHERE
EIC.CFOP = ECF.CFOP AND
EIC.CD_ENTRADA = ECF.CD_ENTRADA
) As VALOR_ICMS
From ENTRADA_CFOP ECF
Group By ECF.CFOP
Order By ECF.CFOP
Inclusive, já havia tentado deste modo, porém o resultado obtido ainda não é o que preciso, pois retornou:
CFOP = 3050
TOTAL_NOTA_CFOP = 100
OUTRAS = 10
BASE_ICMS = 150 (ao invés de 100)
VALOR_ICMS = 23,50 (ao invés de 13,50)
Isso ocorreu porque tenho um outro registro assim:
CFOP = 1400
TOTAL_NOTA_CFOP = 100
OUTRAS = 10
BASE_ICMS = 150 (ao invés de 50)
VALOR_ICMS = 23,50 (ao invés de 10)
Ou seja, a somatória dos dados da Tabela ENTRADA_ICMS, devem ser agrupados por CFOP, e não geral, do modo como aconteceu...
Atenciosamente,
Select
ECF.CFOP,
Sum(ECF.TOTAL_NOTA_CFOP) As TOTAL_NOTA_CFOP,
Sum(ECF.OUTRAS) As OUTRAS,
( SELECT
Sum(EIC.BASE_ICMS)
FROM ENTRADA_ICMS EIC, ENTRADA_CFOP ECF
WHERE
EIC.CFOP = ECF.CFOP AND
EIC.CD_ENTRADA = ECF.CD_ENTRADA
) As BASE_ICMS,
( SELECT
Sum(EIC.VALOR_ICMS)
FROM ENTRADA_ICMS EIC, ENTRADA_CFOP ECF
WHERE
EIC.CFOP = ECF.CFOP AND
EIC.CD_ENTRADA = ECF.CD_ENTRADA
) As VALOR_ICMS
From ENTRADA_CFOP ECF
Group By ECF.CFOP
Order By ECF.CFOP
Inclusive, já havia tentado deste modo, porém o resultado obtido ainda não é o que preciso, pois retornou:
CFOP = 3050
TOTAL_NOTA_CFOP = 100
OUTRAS = 10
BASE_ICMS = 150 (ao invés de 100)
VALOR_ICMS = 23,50 (ao invés de 13,50)
Isso ocorreu porque tenho um outro registro assim:
CFOP = 1400
TOTAL_NOTA_CFOP = 100
OUTRAS = 10
BASE_ICMS = 150 (ao invés de 50)
VALOR_ICMS = 23,50 (ao invés de 10)
Ou seja, a somatória dos dados da Tabela ENTRADA_ICMS, devem ser agrupados por CFOP, e não geral, do modo como aconteceu...
Atenciosamente,
GOSTEI 0
Thomaz_prg
05/06/2006
Desculpe amigo, mas veja só, nas SubSelect´s que usei, eu coloquei um critério (clausula where). Por mais que eu deixe livre de agrupamento (group by) o critério para seleção/soma é obedecido.
O que ocorreu de errado com sua subselect foi que, nas subselect´s na clausula FROM você definiu as 2 tabelas, quando na verdade deveria ter definido apenas a de ENTRADA_ICMS (EIC).
Experimente executar o select que eu enviei no post anterior, da forma comoestá, sem alterar nada e veja se o resultado é satisfatório.
O que ocorreu de errado com sua subselect foi que, nas subselect´s na clausula FROM você definiu as 2 tabelas, quando na verdade deveria ter definido apenas a de ENTRADA_ICMS (EIC).
Experimente executar o select que eu enviei no post anterior, da forma comoestá, sem alterar nada e veja se o resultado é satisfatório.
GOSTEI 0
Hugofab
05/06/2006
Amigo, eu havia feito do modo como vc passou, só que ocorreu o seguinte erro no banco de dados:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
Acabei de fazer novamente, e o erro persiste. Foi somente devido a isto que fiz a inclusão da ENTRADA_CFOP ECF nos sub selects
Obrigado pela atenção !
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
Acabei de fazer novamente, e o erro persiste. Foi somente devido a isto que fiz a inclusão da ENTRADA_CFOP ECF nos sub selects
Obrigado pela atenção !
GOSTEI 0
Thomaz_prg
05/06/2006
desculpe amigo... realmente eu me equivoquei.... o código correto seria:
Foi mal mesmo... mas acho que desta vez resolve (espero).
Select DISTINCT ECF.CFOP, ( SELECT Sum(ECF2.TOTAL_NOTA_CFOP) FROM FROM ENTRADA_CFOP ECF2 WHERE ECF2.CFOP = ECF.CFOP) As TOTAL_NOTA_CFOP, ( SELECT Sum(ECF2.OUTRAS) FROM FROM ENTRADA_CFOP ECF2 WHERE ECF2.CFOP = ECF.CFOP) As OUTRAS, ( SELECT Sum(EIC.BASE_ICMS) FROM ENTRADA_ICMS EIC WHERE EIC.CFOP = ECF.CFOP AND EIC.CD_ENTRADA = ECF.CD_ENTRADA ) As BASE_ICMS, ( SELECT Sum(EIC.VALOR_ICMS) FROM ENTRADA_ICMS EIC WHERE EIC.CFOP = ECF.CFOP AND EIC.CD_ENTRADA = ECF.CD_ENTRADA ) As VALOR_ICMS From ENTRADA_CFOP ECF Order By ECF.CFOP
Foi mal mesmo... mas acho que desta vez resolve (espero).
GOSTEI 0
Hugofab
05/06/2006
thomaz_prg,
Agora funcionou correto muito obrigado!
Um grande abraço
Hugo Fabrício
Agora funcionou correto muito obrigado!
Um grande abraço
Hugo Fabrício
GOSTEI 0