Select complicada
:?: 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
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
Curtidas 0
Respostas
Dadonas
12/03/2007
Neto, se eu entendi direito, a sentença vai ficar +- assim:
Abraço
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
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
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
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
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
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
12/03/2007
Curioso, pesquisei diversos post´s usando case when e aparentemente funcionaram, onde poderá estar o meu problema???
Obrigado novamente.
Neto
Obrigado novamente.
Neto
GOSTEI 0
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
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
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
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, char 8.
Mvp_Operacao.
Neto
GOSTEI 0
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.
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
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
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.
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
12/03/2007
Já tentou um select simples do tipo
select * from tabela para ver se é problema de configuração ?
select * from tabela para ver se é problema de configuração ?
GOSTEI 0
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
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
12/03/2007
select Lot_Id, sum(Mvp_Qtde) As TotEntrada FROM MOVESTOQUE Group by 1
GOSTEI 0
Neto
12/03/2007
Rodou....
Porque rodou ao colocarmos Group By 1
Abraços
Neto
Porque rodou ao colocarmos Group By 1
Abraços
Neto
GOSTEI 0
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
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???
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
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
12/03/2007
[b:8a85af5c11]aerreira[/b:8a85af5c11] falou e disse.
É a mesma coisa que
É a mesma coisa que
select Lot_Id, sum(Mvp_Qtde) As TotEntrada FROM MOVESTOQUE Group by Lot_Id
GOSTEI 0
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
12/03/2007
Ótima explicação Weber, agora entendi o porque rodou.
Muito obrigado
Abraços
Muito obrigado
Abraços
GOSTEI 0