Fórum Select com sum entre 2 tabelas ? #56111

05/06/2006

0

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


Hugofab

Hugofab

Responder

Posts

06/06/2006

Thomaz_prg

Poste a estrutura destas 2 tabelas para ficar mais fácil ajudar.


Responder

Gostei + 0

07/06/2006

Hugofab

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,


Responder

Gostei + 0

07/06/2006

Thomaz_prg

dá pra fazer usando subselect´s:

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.


Responder

Gostei + 0

07/06/2006

Hugofab

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,


Responder

Gostei + 0

07/06/2006

Thomaz_prg

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.


Responder

Gostei + 0

07/06/2006

Hugofab

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 !


Responder

Gostei + 0

07/06/2006

Thomaz_prg

desculpe amigo... realmente eu me equivoquei.... o código correto seria:

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).


Responder

Gostei + 0

08/06/2006

Hugofab

thomaz_prg,


Agora funcionou correto muito obrigado!



Um grande abraço


Hugo Fabrício


Responder

Gostei + 0

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

Aceitar