SQL - Somar Colunas

Firebird

19/04/2007

:idea: Olá a todos.
Preciso de um select que some a quantidade de entradas e quantidade de saidas de produtos lançados na Movimentação de Estoque.
A coluna MVP_OPERACAO define se é Entrada ou Saida.
Abaixo o código que retorna erro:
---
SELECT
Mvp_Cod, Lot_Id, Mvp_Qtde, Prd_CodCombinado, Mvp_Operacao,
sum(case when Mvp_Operacao=´E´ then Mvp_Qtde else 0 end) TotEntra,
sum(case when Mvp_Operacao=´S´ then Mvp_Qtde else 0 end) TotSaida
FROM
MOVESTOQUE
Group by Mvp_Cod, Lot_Id, Mvp_Qtde, Prd_CodCombinado, Mvp_Operacao
--
O erro retornado é:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, char 10.
when.


Abraços e obrigado
Neto


Neto

Neto

Curtidas 0

Respostas

Motta

Motta

19/04/2007

A sintaxe parece correta , informe :
BD,versão, como é feito o acesso etc.

Você tentou este select via alguma ferramenta de acesso direto para ver se o mesmo funciona ?


GOSTEI 0
Neto

Neto

19/04/2007

Uso Delphi 7, Firebird 1.5, DbExpress

SqlDataSet, DataSetProvider, ClientDataSet, DataSource

Estou testando a SQL com o IB Expert.

Abraços

Neto


GOSTEI 0
Motta

Motta

19/04/2007

Mvp_Qtde é numérico ?

A pergunta parece tola mas alguns sistemas utilizam os campos como char para manter um padrão de multi-banco.

Se for isto o case pode estar dando erro de tipos incompatíveis.

Fiz uma query semelhante no Oracle e funcionou.

Teste a query sem o SUM



SELECT 
Mvp_Cod, Lot_Id, Mvp_Qtde, Prd_CodCombinado, Mvp_Operacao, 
 (case when Mvp_Operacao=´E´ then Mvp_Qtde else 0 end) TotEntra, 
 (case when Mvp_Operacao=´S´ then Mvp_Qtde else 0 end) TotSaida 
FROM 
MOVESTOQUE 
Group by Mvp_Cod, Lot_Id, Mvp_Qtde, Prd_CodCombinado, Mvp_Operacao 



GOSTEI 0
Neto

Neto

19/04/2007

Ok Motta,
testei a Sql que me enviou e não rodou.
O Campo Mvp_Qtde é Inteiro.
Testando no IB Expert usando o Sql Editor o retorno é:
==
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, char 6.
when.

Mais uma vez obrigado


GOSTEI 0
Motta

Motta

19/04/2007

Não conheço FB mas acho que o problema é não suportar a sintaxe do case.


GOSTEI 0
Neto

Neto

19/04/2007

Valeu Motta,
obrigado pela ajuda,
vou continuar pesquisando,
Por o que eu consultei no Forum aparentemente a sintaxe está correta.
Muito Obrigado
Neto


GOSTEI 0
Facc

Facc

19/04/2007

Não conheço FB mas acho que o problema é não suportar a sintaxe do case.


O FB Suporta sim o Case, eu já usei várias vezes...

experimente mudar de
 (case when Mvp_Operacao=´E´ then Mvp_Qtde else 0 end) TotEntra,
 (case when Mvp_Operacao=´S´ then Mvp_Qtde else 0 end) TotSaida 


para
 (case when Mvp_Operacao="E" then Mvp_Qtde else 0 end) TotEntra,
 (case when Mvp_Operacao="S" then Mvp_Qtde else 0 end) TotSaida 


Resumindo... de aspas simples para dupla


GOSTEI 0
Neto

Neto

19/04/2007

:idea: Oi Facc obrigado pela ajuda.
Testei e não rodou. Coloquei uma rotina de tratamento de erros e ela retorna assim:
======
Detalhes do Erro
Usuario.....: USUARIO
Hora.........: 20/04/2007 09:28
Categoria..: EOleException
Mensagem.: Token unknown - line 1, char 66
WHEN
Unidade....: UnM2000.pas
Linha........: 905
Endereco..: 5432269
---------------------------------->>>> Intrução SQL
SELECT Lot_Id, Mvp_Qtde, Prd_CodCombinado, Mvp_Operacao, SUM(CASE WHEN MVP_OPERACAO = :Opera THEN MVP_QTDE ELSE 0 END) TOTENTRADA, FROM MOVESTOQUE A GROUP BY Lot_Id, mvp_qtde, prd_codcombinado, mvp_operacao
=== Fim do erro
*** Curioso: Na linha Mensagem, que a rotina apresenta depois da informação char 66 (na tela da aplicação apresenta um caracter estranho tipo( | ) ou como se tivesse um chr(13) para mudar de linha.
Tanto é curioso que a instrução When quando eu copiei e colei aqui no Forum a palavra When foi colocada na linha abaixo como pode ser visto acima. No normal o WHEN é mostrado a frente do char 66.
O que será que está acontecendo?
A rotina de tratamento de erro foi baseada na apresentada no site.
Abraços
Neto


GOSTEI 0
Neto

Neto

19/04/2007

Qual será a forma de fazer o que necessito sem usar o When.
Tenho o código abaixo que também não está rodando:
Testando no IBExpert, apresenta erro no primeiro parenteses após o From.
===
select Mvp_Cod, Lot_Id, Mvp_Qtde, Prd_CodCombinado,
sum(Mvp_Qtde) as TotEntrada,
sum(Mvp_Qtde) as TotSaida
from
(SELECT A.Mvp_Cod, A.Lot_Id, A.Mvp_Qtde, A.Prd_CodCombinado, A.Mvp_Qtde, A.Mvp_Operacao
where A.Mvp_Operacao=´E´
FROM MOVESTOQUE A

union

SELECT A.Mvp_Cod, A.Lot_Id, A.Mvp_Qtde, A.Prd_CodCombinado, A.Mvp_Qtde, A.Mvp_Operacao
where A.Mvp_Operacao=´S´
FROM MOVESTOQUE A
)
group by Mvp_Cod, Lot_Id, Mvp_Qtde, Prd_CodCombinado


GOSTEI 0
Alexandre

Alexandre

19/04/2007

Pessoal boa tarde.

Não manjo ainda de SQL, olhei os posts acima mas não consegui fazer rodar aqui...

Segue expressão...

==========================================

SELECT PREMIO_VALOR,
COUNT(DISTINCT(ID_CONTRATO)) AS CONTRATOS,
COUNT(DISTINCT(ID_CONTRATO)) * PREMIO_VALOR AS VALOR_TOTAL
FROM CONSOLIDADO
WHERE TX_REFERENCIA3 = 'CANCELADO POR INADIMPLENCIA'
AND ANO_MES_REF = '201509'
GROUP BY PREMIO_VALOR

==========================================

PREMIO_VALOR CONTRATOS VALOR_TOTAL
4,99 456 2275,44
10,99 263 2890,37
15,9 604 9603,6
19,9 2766 55043,4

Preciso somar o total das colunas CONTRATOS e VALOR_TOTAL

Desde á agradeço.

Abraço.
GOSTEI 0
POSTAR