Ajuda com select Firebird 2.5
Moderador: Moderadores
Ajuda com select Firebird 2.5
Olá a todos,
mais uma ajuda com select em firebird 2.5
tenho uma tabela de comissões, os calculos, tá tudo funcionado perfeitamente, queria extrair desta tabela o sequinte. Já tentei com com distinct, mas tem que envolver mais campos.
imagina a seguinte tabela COMISSAO_FICHA, nome vendedor, saldo geral , saldo disponível,sequencia
nome vendedor,vlsaldoGeral, vlsaldoDisp,sequencia
obs. sequencia nunca se repete para o mesmo vendedor
joao , 100,200, 0001
joao , 25,155, 0002
joao , 100,200, 0003
pedro, 25,1500,0001
pedro, 250,320,0002
pedro, 450,125,0003
Preciso mostrar no browse
joao , 100,200
pedro ,450,125
mostrar o nome sem repetir e pegando os dados da última sequencia de cada vendedor.
quebrei a cabeça aqui, mas não consegui, se alguém puder ajudar, agradeço.
Obrigado
Poka
mais uma ajuda com select em firebird 2.5
tenho uma tabela de comissões, os calculos, tá tudo funcionado perfeitamente, queria extrair desta tabela o sequinte. Já tentei com com distinct, mas tem que envolver mais campos.
imagina a seguinte tabela COMISSAO_FICHA, nome vendedor, saldo geral , saldo disponível,sequencia
nome vendedor,vlsaldoGeral, vlsaldoDisp,sequencia
obs. sequencia nunca se repete para o mesmo vendedor
joao , 100,200, 0001
joao , 25,155, 0002
joao , 100,200, 0003
pedro, 25,1500,0001
pedro, 250,320,0002
pedro, 450,125,0003
Preciso mostrar no browse
joao , 100,200
pedro ,450,125
mostrar o nome sem repetir e pegando os dados da última sequencia de cada vendedor.
quebrei a cabeça aqui, mas não consegui, se alguém puder ajudar, agradeço.
Obrigado
Poka
Editado pela última vez por Itamar M. Lins Jr. em 27 Nov 2024 18:24, em um total de 2 vezes.
Razão: Temos este lugar específico pra a linguagem SQL. Movido do forum (Outras linguagens de programação)
Razão: Temos este lugar específico pra a linguagem SQL. Movido do forum (Outras linguagens de programação)
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Ajuda com select Firebird 2.5
Num primeiro momento eu usaria um subselect.
O que precisa ? o maior número sequencial de cada um
Pensando em MySQL, não fiz o teste prático se funciona assim:
É uma idéia.
Tente também perguntar no chatgpt ou copilot.
O que precisa ? o maior número sequencial de cada um
Pensando em MySQL, não fiz o teste prático se funciona assim:
Código: Selecionar todos
SELECT * FROM tabela
WHERE sequencial, vendedor IN
( select max( sequencial ) as maior, vendedor from tabela group by vendedor )
Tente também perguntar no chatgpt ou copilot.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Ajuda com select Firebird 2.5
Olá!
Via chatgpt:
Saudações,
Itamar M. Lins Jr.
Via chatgpt:
Código: Selecionar todos
SELECT
v.nome_vendedor,
f.vlsaldoGeral,
f.vlsaldoDisp
FROM
COMISSAO_FICHA f
INNER JOIN (
SELECT
nome_vendedor,
MAX(sequencia) AS ultima_sequencia
FROM
COMISSAO_FICHA
GROUP BY
nome_vendedor
) v ON f.nome_vendedor = v.nome_vendedor
AND f.sequencia = v.ultima_sequencia;
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
Ajuda com select Firebird 2.5
Bom dia
Quintas, não consegui fazer dar certo.
Itamar, deu certo.
Obrigado Quintas e Itamar
Poka
Quintas, não consegui fazer dar certo.
Itamar, deu certo.
Obrigado Quintas e Itamar
Poka
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Ajuda com select Firebird 2.5
Perguntei no chatgpt:
Talvez outro formato.
Resposta:como ficaria este comando do mysql no firebird ?
SELECT * FROM tabela
WHERE sequencial, vendedor IN
( select max( sequencial ) as maior, vendedor from tabela group by vendedor )
Pensando bem, seria como comparar ARRAY com número, foi isso que errei.Problemas na versão original:
O uso de sequencial, vendedor IN não é uma sintaxe válida em SQL. O correto seria comparar as colunas individualmente dentro de um IN, ou então usar um JOIN para correlacionar as duas tabelas.
O MySQL permite esse tipo de consulta, mas no Firebird, é necessário estruturar o código de forma um pouco diferente.
Conversão para Firebird:
No Firebird, você pode reescrever a consulta utilizando uma junção (JOIN) com a subconsulta, já que o Firebird não permite diretamente a comparação de múltiplas colunas em um IN.
Aqui está uma versão ajustada da consulta para o Firebird:
sql
Copiar código
SELECT t.*
FROM tabela t
JOIN (
SELECT MAX(sequencial) AS maior, vendedor
FROM tabela
GROUP BY vendedor
) sub ON t.sequencial = sub.maior AND t.vendedor = sub.vendedor
Explicação:
A subconsulta (SELECT MAX(sequencial) AS maior, vendedor FROM tabela GROUP BY vendedor) retorna a linha com o maior sequencial para cada vendedor.
A junção entre a tabela tabela (referenciada como t) e a subconsulta (alias sub) é feita nas colunas sequencial e vendedor para garantir que a consulta principal traga os registros corretos.
Isso deve funcionar corretamente no Firebird.
Talvez outro formato.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Ajuda com select Firebird 2.5
Uia.
Mas acho que no join vai ser mais rápido do que comparar cada linha, porque vai ser otimizado pelo MySQL.
Estou mostrando isso porque é interessante.
O comando estava errado mas a idéia estava certa, o chatgpt entendeu o que precisava como resultado.
E, lógico, sugeriu o que é mais rápido, e não a correção do que coloquei.
Até que meu chute foi válido, só faltou colocar os dois entre parêntesisexiste uma forma de usar o IN pra mais de uma coluna ?
Sim, é possível usar o IN para mais de uma coluna no SQL, mas a sintaxe exata depende do banco de dados que você está usando. No MySQL, por exemplo, você pode usar a cláusula IN com múltiplas colunas, como você fez na sua consulta original. No Firebird, no entanto, isso não é suportado diretamente da mesma forma. Porém, é possível usar uma abordagem similar com uma subconsulta ou uma combinação de colunas.
No MySQL:
O MySQL permite comparar múltiplas colunas em um IN diretamente, como no seu exemplo original:
SELECT *
FROM tabela
WHERE (sequencial, vendedor) IN (
SELECT MAX(sequencial), vendedor
FROM tabela
GROUP BY vendedor
);
Essa sintaxe funciona no MySQL, mas não é suportada diretamente no Firebird.
Mas acho que no join vai ser mais rápido do que comparar cada linha, porque vai ser otimizado pelo MySQL.
Estou mostrando isso porque é interessante.
O comando estava errado mas a idéia estava certa, o chatgpt entendeu o que precisava como resultado.
E, lógico, sugeriu o que é mais rápido, e não a correção do que coloquei.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Ajuda com select Firebird 2.5
Olá a todos
Algumas coisas que eu sei, fazendo varios selects separadados ( não sub select) , aí eu gravo na matriz,
eu chego no que eu quero, gravando as matrizes, mas sei que tem como fazer um um comando só .
Sempre que me passam alguma coisa aqui, vou usando quando tiver alguma coisa relativa.
Estou precisando agora de um select para resolver o seguinte
imprimir o que foi pago
Já pesquisei bastante, mas não achei realmente o que eu preciso, se eu tivesse gravado o valor em campos separados
debito e credito, resolveria fácil, para testar o campo DC, deu uma travada.
logico que esse select não deu certo, só pra elucidar como eu precisaria.
select b.docum , sum(b.valor) as credito from pagarB b where b.dc='C' group by b.docum
(select docum , sum(valor) as credito from pagarB where dc='D' group by docum)
INNER JOIN pagarG g ON g.docum=b.docum
tabelas
campo VALOR de receberB (contem os valores baixados)
campo valor de receberG (contem o valor total do documento)
agradeço qq ajuda
Poka
Algumas coisas que eu sei, fazendo varios selects separadados ( não sub select) , aí eu gravo na matriz,
eu chego no que eu quero, gravando as matrizes, mas sei que tem como fazer um um comando só .
Sempre que me passam alguma coisa aqui, vou usando quando tiver alguma coisa relativa.
Estou precisando agora de um select para resolver o seguinte
imprimir o que foi pago
Já pesquisei bastante, mas não achei realmente o que eu preciso, se eu tivesse gravado o valor em campos separados
debito e credito, resolveria fácil, para testar o campo DC, deu uma travada.
logico que esse select não deu certo, só pra elucidar como eu precisaria.
select b.docum , sum(b.valor) as credito from pagarB b where b.dc='C' group by b.docum
(select docum , sum(valor) as credito from pagarB where dc='D' group by docum)
INNER JOIN pagarG g ON g.docum=b.docum
tabelas
campo VALOR de receberB (contem os valores baixados)
campo valor de receberG (contem o valor total do documento)
agradeço qq ajuda
Poka
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Ajuda com select Firebird 2.5
Acho que voce mesmo já respondeu.
Poka escreveu: se eu tivesse gravado o valor em campos separados
debito e credito, resolveria fácil,
Código: Selecionar todos
SELECT SUM( IF( DC='D', valor, 0 ) ) AS ENTRADA, SUM( IF( DC='C', valor, 0 ) ) AS SAIDA...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Ajuda com select Firebird 2.5
Olá a todos
outo entrave agora,
Toda a parte de insert, alterar, exclui, tudo isso tenho no meu sistema sem problemas, relatórios os mais simplicados.
Quando acontece caso assim mais complicado, é que não estou conseguindo.
não sei se vou conseguir explicar, esse select está me devolvendo tudo que preciso, mas não no agrupamento que eu quero.
os campos do select de < b.docum até p.fantasia > e mais o sum sao os campos que eu preciso.
cada campo pego do seu arquivo correspondente, só que no GROUP BY parece que tenho que colocar os todos campos, aí sai agrupamento errado.
O que precisaria.
No select de < b.docum até p.fantasia > queria colocar, por exemplo, somente p.fantasia e b.docum, e os outros campos como extrairia?
Se não fosse obrigado colocar no group by todos os campos do select, tudo bem, daria certo.
obs , xdata1, xdata2 , xcodfor1 e xcofor 2 são variáveis.
Poka
outo entrave agora,
Toda a parte de insert, alterar, exclui, tudo isso tenho no meu sistema sem problemas, relatórios os mais simplicados.
Quando acontece caso assim mais complicado, é que não estou conseguindo.
não sei se vou conseguir explicar, esse select está me devolvendo tudo que preciso, mas não no agrupamento que eu quero.
os campos do select de < b.docum até p.fantasia > e mais o sum sao os campos que eu preciso.
cada campo pego do seu arquivo correspondente, só que no GROUP BY parece que tenho que colocar os todos campos, aí sai agrupamento errado.
O que precisaria.
No select de < b.docum até p.fantasia > queria colocar, por exemplo, somente p.fantasia e b.docum, e os outros campos como extrairia?
Se não fosse obrigado colocar no group by todos os campos do select, tudo bem, daria certo.
obs , xdata1, xdata2 , xcodfor1 e xcofor 2 são variáveis.
Código: Selecionar todos
str:="SELECT b.docum, b.codfor,b.tpnota,b.serie,b.ordem , b.data, g.qp, p.nome, g.tpcobra ,d.valor , d.saldo , p.fantasia, SUM( IIF( b.DC='D', b.valor, 0 ) ) AS debito , SUM( IIF( b.DC='C', b.valor, 0 ) ) AS credito ";
+" from pagarb b " ;
+" INNER JOIN pagarg g on g.docum = b.docum " ;
+" and g.codfor = b.codfor " ;
+" and g.tpnota = b.tpnota " ;
+" and g.serie = b.serie " ;
+" INNER JOIN pagard d on d.docum = b.docum " ;
+" and d.codfor = b.codfor " ;
+" and d.tpnota = b.tpnota " ;
+" and d.serie = b.serie " ;
+" INNER JOIN pessoas p ON (b.codfor||'FOR' = p.codigo||p.tppessoa )";
+" WHERE b.codfor >= '"+xcodfor1+"' and b.codfor <= '"+xcodfor2 +"' ";
+" and b.data >= '"+fb_data(xdata1)+"' and b.data <= '"+fb_data(xdata2) +"' ";
+" group by b.docum , b.codfor , b.tpnota, b.serie , b.ordem , b.data , g.qp , p.nome , g.tpcobra,d.valor , d.saldo, p.fantasia order by p.fantasia || b.docum ;"
Poka
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Ajuda com select Firebird 2.5
parece?Poka escreveu:só que no GROUP BY parece que tenho que colocar os todos campos,
Isso significa que não tentou, ou que dá erro.
Se está totalizando, fica difícil totalizar se pede detalhe.
Confere o que está pedindo e o que está totalizando.
Não esquece que dá pra testar o heidisql, por exemplo, ele tem mais opções de bases do que antigamente, que era só mysql
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Ajuda com select Firebird 2.5
Olá Quintas
Poka
Quintas, mas eu coloquei, não está dando erro, só não está saindo como eu quero. Eu preciso de todos aqueles campos, mas não quero todos eles no no agrupamento. Não sei se consegui explicar direitoparece?
Isso significa que não tentou, ou que dá erro.
Poka
