Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Soma SQL com Group By


Duduh_Capixaba

Pergunta

Olá pessoas!

Estou querendo mostrar dois resultados, em dois grids, pegando

dados da mesma tabela. Vamos lá!

Os campos que eu tenho na tabela são: DATA, COO, ITEM, MATRIC, QUANT, VRUNIT, VRLIQUIDO, ALIQCST

e referem-se a cupons fiscais. Os dados estão gravados na tabela no seguinte modo:

01/10/2009 | 000001 | 001 | 000010 | 1,00 | 1,50 | 1,50 | T

01/10/2009 | 000001 | 002 | 000055 | 2,00 | 1,50 | 3,00 | T

01/10/2009 | 000002 | 001 | 000110 | 1,00 | 0,50 | 0,50 | T

02/10/2009 | 000003 | 001 | 000023 | 1,00 | 0,99 | 0,99 | T

02/10/2009 | 000003 | 002 | 005009 | 3,00 | 1,50 | 4,50 | T

02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | T

03/10/2009 | 000004 | 001 | 000010 | 1,00 | 1,99 | 1,99 | T

02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | C

onde C, no campo ALIQCST, significa que o item do cupom foi cancelado,

e o T, a sua situação tributária.

Na primeira query, minha SQL ficou da seguinte forma:

SELECT DATA, COO, SUM(VRLIQUIDO) AS TOTAL FROM SIN60I WHERE DATA = :DATA AND ALIQCST <> "CANC"
GROUP BY DATA, COO
Ela soma o valor total dos itens, agrupando os resultados por data e cupom, simulando o total geral do cupom fiscal. Na segunda query eu mostro os itens do cupom, assim:
SELECT COO, ITEM, MATRIC, QUANT, VRUNIT, VRLIQUIDO, BASEICMS,
VRICMS FROM SIN60I WHERE COO = :COO
GROUP BY COO, ITEM, MATRIC, QUANT, VRUNIT, VRLIQUIDO, BASEICMS,
VRICMS
HAVING COUNT(ITEM) = 1

O problema está na primeira query. Ela deixa de somar o cupom com situação

C, correto, mas ela tb deveria não somar o item que está cancelado. Pegando

como base o exemplo acima:

02/10/2009 | 000003 | 001 | 000023 | 1,00 | 0,99 | 0,99 | T

02/10/2009 | 000003 | 002 | 005009 | 3,00 | 1,50 | 4,50 | T

02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | T

02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | C

a soma disso tudo dá: 7,49. O resultado da minha SQL mostra: 6,49.

Mas o valor correto a mostrar seria: 5,49, pois apenas os itens 1 e 2

foram realmente impressos, o 3 foi cancelado, mas é exibido duas

vezes. A segunda SQL está correta, ela mostra apenas os itens que

realmente foram impressos, isso porque eu exibo apenas os itens que,

somados, tem valor igual a 1. Já na primeira SQL eu não tenho como

usar este atributo, pois os itens não podem aparecer na consulta.

Já tentei várias formas de solucionar o problema, com vários selects

diferentes, mas sem muito sucesso. Vou continuar tentado, enquanto

aguardo uma ajuda.

Editado por Duduh_Capixaba
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

É, tá muito complicada essa Query...! Tentei fazer o seguinte...

Criei mais uma consulta e modifiquei a primeira, ficando assim:

1a query:

SELECT DATA, COO, ITEM, VRLIQUIDO FROM SIN60I WHERE DATA = :DATA
ORDER BY DATA, COO, ITEM
assim, eu trago a soma de todos os ítens, inclusive os cancelados. 2a query:
SELECT DATA, COO, (SUM(VRLIQUIDO) - (SELECT SUM(VRLIQUIDO) FROM SIN60I WHERE COO = :COO
  GROUP BY COO, ITEM, VRLIQUIDO
  HAVING COUNT(ITEM) > 1)) AS TOTAL FROM SIN60I WHERE COO = :COO
GROUP BY DATA, COO

isto deveria me trazer a diferença da soma dos ítens não cancelados

com os cancelados, mas quando ligo a Grid ao Data Source, não aparece

nada :( Se eu coloco um nro de cupom existente no lugar do parâmetro

do subselect, aí dá certo, mas fico com um nro fixo.

Estou chegando perto, mas tá complicado.

Link para o comentário
Compartilhar em outros sites

  • 0

Descobri que eu posso deletar os ítens cancelados da base de dados.

Nesse caso, como faria para deletar os registros 3 e 4 desse exemplo?

02/10/2009 | 000003 | 001 | 000023 | 1,00 | 0,99 | 0,99 | T

02/10/2009 | 000003 | 002 | 005009 | 3,00 | 1,50 | 4,50 | T

02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | T

02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | C

Link para o comentário
Compartilhar em outros sites

  • 0
Descobri que eu posso deletar os ítens cancelados da base de dados.

Nesse caso, como faria para deletar os registros 3 e 4 desse exemplo?

onde C, no campo ALIQCST, significa que o item do cupom foi cancelado,

e o T, a sua situação tributária.

Se ALIQCST <> 'C' então os registros que não tenham a letra 'C' no campo serão incluidos na pesquisa

SELECT DATA, COO, SUM(VRLIQUIDO) AS TOTAL FROM SIN60I WHERE DATA = :DATA AND ALIQCST <> 'C'
GROUP BY DATA, COO

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pela resposta Jhonas, mas é um pouco mais complicado que isso.

Não sei se você leu todo o primeiro post, mas eu tenho que excluir os itens

cancelados, ou seja, os registros que contém a letra "C" em ALIQCST e tb

os registros que se referem a ele. Meio confuso né?! Deixa eu explicar com

um exemplo...

DATA | COO | ITEM | MATRIC | QUANT | VRUNIT | VRLIQUIDO | ALIQCST

02/10/2009 | 000003 | 001 | 000023 | 1,00 | 0,99 | 0,99 | T

02/10/2009 | 000003 | 002 | 005009 | 3,00 | 1,50 | 4,50 | T

02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | T

02/10/2009 | 000003 | 003 | 000211 | 2,00 | 0,50 | 1,00 | C

Estes dados se referem a um cupom (COO = 3), onde o item 3 foi cancelado.

Perceba que estou falando do item 3, ITEM = 003, e não do 3º registro, ok?!

Bem, então, nesse exemplo, eu teria que excluir o 3º e o 4º registros. porque?

porque como o 4º registro me informa que o item 3 foi excluido, então eu não

posso somar nem o valor do registro 3, nem do 4. Apenas os itens 1 e 2

foram impressos pela impressora fiscal, totalizando R$ 5,49.

Link para o comentário
Compartilhar em outros sites

  • 0

Novamente agradeço a ajuda e o interesse Jhonas, mas, perceba

que isso é só um exemplo. Eu tenho "N" possibilidades de cancelamentos.

Um único cupom fiscal pode ter "N" itens, e desses, qualquer um deles

pode estar cancelado, ou seja, o filtro "AND ITEM = X" deve apontar para

o(s) item(ns) cancelado(s).

Eu já resolvi esse problema via programação. Separei os itens cancelados

em outra tabela, e agora posso controlá-los mais facilmente. Mas fica o

desafio aí, pra quem quiser se aventurar.

Abraço, e obrigado!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...