Select complicada

Firebird

12/03/2007

:?: Olá a todos,
Uso Delphi 7 + Firebid + DbExpress.
Tenho um cadastro de Lotes de produção onde registro diariamente a produção de postes pre-fabricados no dia.
Na movimentação do estoque de produtos (postes), preciso informar o código do poste e o lote de produção ao qual este pertence.
Quero montar um select que mostre num DbGrid o seguinte:
Abaixo os Campos:
Nro_Lote -> Lot_Id
Cod_Produto -> Prd_Cod
E/S -> Mvp_Operacao
Qtde -> Mvp_Qtde
Entrada ->Soma dos registros de entrada
Saida -> Soma dos registros de saida
NroLote----Cod.Prd--E/S----Qtde----Entrada----Saida
050307---- 01-002 E 5 5
050307---- 01-002 S 1 0 1
050307---- 01-002 S 2 0 2
...
Minha select que não funciona
=====
SELECT A.Lot_Cod, A.Lot_Id, A.Lot_Qtde, A.Prd_Cod,
Count(if (Mvp_Operacao=´E´ then Mvp_Qtde else 0)) as TotEntrada,
Count(if (Mvp_Operacao=´S´ then Mvp_Qtde else 0)) as TotSaida
FROM MOVESTOQUE A
...
Pois é quero criar duas colunas no DbGrid que mostre o total informado de entradas e outra coluna com o total informado de saidas.

Abraços a todos
Neto


Neto

Neto

Curtidas 0

Respostas

Dadonas

Dadonas

12/03/2007

Neto, se eu entendi direito, a sentença vai ficar +- assim:


select Lot_Cod, Lot_Id, Lot_Qtde, Prd_Cod,
         sum(TotEntrada) TotEntrada,
         sum(TotSaida) TotSaida
from
  (SELECT A.Lot_Cod, A.Lot_Id, A.Lot_Qtde, A.Prd_Cod,
   Mvp_Qtde TotEntrada, 0 TotSaida
   where Mvp_Operacao=´E´
   FROM MOVESTOQUE A 

   union

   SELECT A.Lot_Cod, A.Lot_Id, A.Lot_Qtde, A.Prd_Cod,
   0 TotEntrada, Mvp_Qtde TotSaida
   where Mvp_Operacao=´S´
   FROM MOVESTOQUE A
  ) 
group by Lot_Cod, Lot_Id, Lot_Qtde, Prd_Cod


Abraço


GOSTEI 0
Neto

Neto

12/03/2007

:?: Olá Dadonas, obrigado pelo interesse em ajudar.
Testei o codigo e não rodou, preciso é somar o campo Mvp_Qtde da tabela MOVESTOQUE, quando a operação (MVP_OPERACAO) é igual ´E´ somar na variavel virtual TotEntrada quando a operação é igual ´S´ somar na variavel virtual TotSaida.
Obrigado
Neto


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

12/03/2007

talves isso resolva:
SELECT
  A.Lot_Cod, A.Lot_Id, A.Lot_Qtde, A.Prd_Cod,
  sum(case when Mvp_Operacao=´E´ then A.Mvp_Qtde else 0 end) TotEntrada,
  sum(case when Mvp_Operacao=´S´ then A.Mvp_Qtde else 0 end) TotSaida
FROM
  MOVESTOQUE A
Group by
  A.Lot_Cod, A.Lot_Id, A.Lot_Qtde, A.Prd_Cod



GOSTEI 0
Neto

Neto

12/03/2007

Não rodou
Testando no Sql Editor do IB Expert abaixo o erro reportado:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, char 8.
When.

Quando executada a aplicação o erro é:
Token Unknown - Line 1, Char 52 When

Será que ele entende o comando Case when??
Uso Firibird + DBExpress

Abraços
Neto


GOSTEI 0
Neto

Neto

12/03/2007

Curioso, pesquisei diversos post´s usando case when e aparentemente funcionaram, onde poderá estar o meu problema???
Obrigado novamente.
Neto


GOSTEI 0
Facc

Facc

12/03/2007

Experimente assim

SELECT
A.Lot_Cod, A.Lot_Id, A.Lot_Qtde, A.Prd_Cod,
sum(case Mvp_Operacao when ´E´ then A.Mvp_Qtde else 0 end) TotEntrada,
sum(case Mvp_Operacao when ´S´ then A.Mvp_Qtde else 0 end) TotSaida
FROM
MOVESTOQUE A
Group by
A.Lot_Cod, A.Lot_Id, A.Lot_Qtde, A.Prd_Cod


GOSTEI 0
Neto

Neto

12/03/2007

Declarei Mvp_operacao no select mas mesmo assim apresenta:

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

Neto


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

12/03/2007

qual a versão do Firebird ?
Se estiver usando a 2.0, sugiro que faça o downgrade para a versão 1.5.x, pois a versão 2 ainda é RC (release candidate) e ainda não deve ser usada em ambiente de produção.


GOSTEI 0
Aerreira

Aerreira

12/03/2007

Acho que um pequeno ajuste no código do Dadonas resolve:

select Lot_Cod, Lot_Id, Lot_Qtde, Prd_Cod, 
         sum(Mvp_Qtde) as TotEntrada, 
         sum(Mvp_Qtde) as TotSaida 
from 
  (SELECT A.Lot_Cod, A.Lot_Id, A.Lot_Qtde, A.Prd_Cod, A.Mvp_Qtde, A.Mvp_Operacao
   where A.Mvp_Operacao=´E´ 
   FROM MOVESTOQUE A 

   union 

   SELECT A.Lot_Cod, A.Lot_Id, A.Lot_Qtde, A.Prd_Cod, A.Mvp_Qtde, A.Mvp_Operacao
   where A.Mvp_Operacao=´S´ 
   FROM MOVESTOQUE A 
  ) 
group by Lot_Cod, Lot_Id, Lot_Qtde, Prd_Cod 



GOSTEI 0
Neto

Neto

12/03/2007

Uso Firebird 1.5
Quanto a sugestão do Aerreira testei com Ib Expert a SQL:

select A.Lot_Id, A.Mvp_Qtde, A.Prd_CodCombinado,
sum(A.Mvp_Qtde) as TotEntrada,
sum(A.Mvp_Qtde) as TotSaida
from
(SELECT 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.Lot_Id, A.Mvp_Qtde, A.prd_codcombinado, A.Mvp_Qtde, A.Mvp_Operacao where A.Mvp_Operacao=´S´
FROM MOVESTOQUE A
)
group by Lot_Id, Lot_Qtde, Prd_Cod


RETORNA:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 5, char 2.
SELECT.


GOSTEI 0
Motta

Motta

12/03/2007

Já tentou um select simples do tipo
select * from tabela para ver se é problema de configuração ?


GOSTEI 0
Neto

Neto

12/03/2007

Sim
Testei um select simples e roda exemplo:
select Lot_Id, Mvp_Qtde FROM MOVESTOQUE ==> Ok... retorna as duas colunas.

Assim select sum(Mvp_Qtde) As TotEntrada FROM MOVESTOQUE Ok, retorna uma coluna com a soma, mas como abaixo não roda

select Lot_Id, sum(Mvp_Qtde) As TotEntrada FROM MOVESTOQUE, quando uso SUM e adiciono uma nova coluna na SQL ele retorna erro

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
user name required.

Neto


GOSTEI 0
Weber

Weber

12/03/2007

select Lot_Id, sum(Mvp_Qtde) As TotEntrada FROM MOVESTOQUE
Group by 1



GOSTEI 0
Neto

Neto

12/03/2007

Rodou....
Porque rodou ao colocarmos Group By 1
Abraços
Neto


GOSTEI 0
Aerreira

Aerreira

12/03/2007

Rodou.... Porque rodou ao colocarmos Group By 1 Abraços Neto

Ué... rodou mas não serve aos seus propósitos... ou serve?


GOSTEI 0
Neto

Neto

12/03/2007

Quero compreender o porque!
Só isso.
Não estou deizendo que não serviu, apenas compreender tecnicamente qual o efeito.
Abraços e paciência
Neto

Ps: A propósito vc sabe me responder????? porque rodou???


GOSTEI 0
Aerreira

Aerreira

12/03/2007

select Lot_Id, sum(Mvp_Qtde) As TotEntrada FROM MOVESTOQUE
Group by 1


GROUP BY 1 é a mesma coisa que GROUP BY Lot_Id, ou seja o primeiro campo. Se fosse group by 2 seria o segundo campo, assim sucessivamene.


GOSTEI 0
Weber

Weber

12/03/2007

[b:8a85af5c11]aerreira[/b:8a85af5c11] falou e disse.

É a mesma coisa que
select Lot_Id, sum(Mvp_Qtde) As TotEntrada FROM MOVESTOQUE 
Group by Lot_Id



GOSTEI 0
Weber

Weber

12/03/2007

porque rodou???


Rodou porque é obrigatorio toda vez que se fazer um Count, Sum, Avg, Max, Min se o select contiver outros campos que não os do Sum (por exemplo) o resultado deve ser agrupado por eles.


GOSTEI 0
Neto

Neto

12/03/2007

Ótima explicação Weber, agora entendi o porque rodou.
Muito obrigado
Abraços


GOSTEI 0
POSTAR