Página 1 de 2

Ajuda com select Firebird 2.5

Enviado: 27 Nov 2024 14:52
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

Ajuda com select Firebird 2.5

Enviado: 27 Nov 2024 16:37
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.

Ajuda com select Firebird 2.5

Enviado: 27 Nov 2024 20:25
por Poka
Vou testar aqui Quintas.

Obrigado


Poka

Ajuda com select Firebird 2.5

Enviado: 27 Nov 2024 22:30
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.

Ajuda com select Firebird 2.5

Enviado: 28 Nov 2024 08:18
por Poka
Bom dia

Quintas, não consegui fazer dar certo.

Itamar, deu certo.

Obrigado Quintas e Itamar

Poka

Ajuda com select Firebird 2.5

Enviado: 29 Nov 2024 18:34
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.

Ajuda com select Firebird 2.5

Enviado: 29 Nov 2024 18:44
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.

Ajuda com select Firebird 2.5

Enviado: 02 Dez 2024 20:54
por Poka
Obrigado Quintas pelas explicações.


Poka

Ajuda com select Firebird 2.5

Enviado: 09 Dez 2024 14:08
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

Ajuda com select Firebird 2.5

Enviado: 13 Dez 2024 08:08
por Poka
Bom dia,

Alguém tem alguma idéia?

Grato

Poka

Ajuda com select Firebird 2.5

Enviado: 13 Dez 2024 08:31
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...

Ajuda com select Firebird 2.5

Enviado: 13 Dez 2024 12:59
por Poka
Obrigado Quintas
deu certo



Poka

Ajuda com select Firebird 2.5

Enviado: 16 Dez 2024 18:36
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

Ajuda com select Firebird 2.5

Enviado: 16 Dez 2024 21:50
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

Ajuda com select Firebird 2.5

Enviado: 17 Dez 2024 07:49
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