Ajuda com select Firebird 2.5

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com select Firebird 2.5

Mensagem por Poka »

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
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)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com select Firebird 2.5

Mensagem por JoséQuintas »

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:

Código: Selecionar todos

SELECT * FROM tabela
WHERE sequencial, vendedor IN
   ( select max( sequencial ) as maior, vendedor from tabela group by vendedor )
É uma idéia.
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/
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com select Firebird 2.5

Mensagem por Poka »

Vou testar aqui Quintas.

Obrigado


Poka
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Ajuda com select Firebird 2.5

Mensagem por Itamar M. Lins Jr. »

Olá!
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;
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com select Firebird 2.5

Mensagem por Poka »

Bom dia

Quintas, não consegui fazer dar certo.

Itamar, deu certo.

Obrigado Quintas e Itamar

Poka
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com select Firebird 2.5

Mensagem por JoséQuintas »

Perguntei no chatgpt:
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 )
Resposta:
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.
Pensando bem, seria como comparar ARRAY com número, foi isso que errei.
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com select Firebird 2.5

Mensagem por JoséQuintas »

Uia.
existe 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.
Até que meu chute foi válido, só faltou colocar os dois entre parêntesis

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/
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com select Firebird 2.5

Mensagem por Poka »

Obrigado Quintas pelas explicações.


Poka
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com select Firebird 2.5

Mensagem por Poka »

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
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com select Firebird 2.5

Mensagem por Poka »

Bom dia,

Alguém tem alguma idéia?

Grato

Poka
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com select Firebird 2.5

Mensagem por JoséQuintas »

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/
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com select Firebird 2.5

Mensagem por Poka »

Obrigado Quintas
deu certo



Poka
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com select Firebird 2.5

Mensagem por Poka »

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.

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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com select Firebird 2.5

Mensagem por JoséQuintas »

Poka escreveu:só que no GROUP BY parece que tenho que colocar os todos campos,
parece?
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/
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com select Firebird 2.5

Mensagem por Poka »

Olá Quintas
parece?
Isso significa que não tentou, ou que dá erro.
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 direito


Poka
Responder