Página 1 de 1

Ajuda com select em Firebird

Enviado: 14 Fev 2024 09:00
por Poka
Bom dia,


Precisava mostrar os últimos X dias os totais vencimentos dia a dia até hoje.
ex; hoje dia 14/02/2024 - 10 dias
04/02/2024 total do inicio ate o dia 4
05/02/2024 total do inicio ate o dia 5
assim por diante
fb_data() é uma função minha para transformar a data para execução
xtexto:="
esse primeiro exemplo me dá o resultado corretamente,
xdata:=datadehoje - 10

Código: Selecionar todos

 for a:= xdata to dataDeHoje
   str:="select sum(d.saldo)  from "+receberd +" d" ;
   +" LEFT JOIN "+NOTAD +" n  ON (d.docum||d.codcli||d.tpnota||d.serie =  n.docum||n.destino||n.tpnota||n.serie ) ";
   +" where d.dtvenc <= '"+ fb_data(a) + "' and d.saldo <> '0' and n.status <> '04' ;"
   fb_executa()  // funcao que executa e me retorna matriz m_select
   xtexto+= "total até o dia: " +dtoc(a)+ " "+transfo(m_select[1,1] , "@e 99,999,999.99")+fl
next
  

esse exemplo anterior com muitos registros deve demorar muito, pois estou indo dia a dia no arquivo,
acho que no exemplo abaixo seria mais rápido, mas está voltando o resultado de hoje em todos os dias.
Ou alguma outra solução que não seja esta.
O correto seria me retornar agrupado tudo de uma só vez.

Código: Selecionar todos

 str:="select extract(day from d.dtvenc) as dia ,  sum(d.saldo) ,d.dtvenc  from "+receberd +" d" ;
+" LEFT JOIN "+NOTAD +" n  ON (d.docum||d.codcli||d.tpnota||d.serie =  n.docum||n.destino||n.tpnota||n.serie ) ";
+" where d.dtvenc <= '"+ fb_data(dataDeHojeg-10 ) + "' and  d.dtvenc <= '"+ fb_data(datadehoje) +"' and  d.saldo <> '0' and n.status <> '04' ";
+" group by dia , dtvenc ;"  


Obrigado

Poka

Ajuda com select em Firebird

Enviado: 14 Fev 2024 10:59
por JoséQuintas
no MySQL talvez assim:

Código: Selecionar todos

SELECT SUM(saldo), dtvenc
FROM  ...
WHERE dtvenc BETWEEN datainicial AND datafinal
GROUP BY dtvenc
ORDER BY dtvenc
E na hora do relatório ou browse, pode mostrar Day( dtVenc )

Lembrando que se fizer do dia 25 a dia 5, em ordem de dia, vai ficar fora de ordem de data, melhor por data mesmo.

E se precisar, no relatório mostrar hoje - vencto, pra mostrar há quantos dias está vencido, pode ser interessante.

Ajuda com select em Firebird

Enviado: 14 Fev 2024 12:33
por Poka
Obrigado Quintas, vou testar aqui


Poka

Ajuda com select em Firebird

Enviado: 14 Fev 2024 19:09
por JoséQuintas
Só lembrete:

Se for considerado campo DATETIME, o horário faz diferença.
Num caso desses é se prevenir usando alguma função ou outra forma.
É que o SELECT pode considerar zero horas do inicial até zero horas do final, o que deixaria a última data de fora, se for datetime.

Ajuda com select em Firebird

Enviado: 15 Fev 2024 02:26
por alxsts
Olá!

Creio que, neste caso, um CTE Recursivo (Recursive Common Table Expression) ajudaria. Este recurso está disponível a partir da versão 2.1 do Firebird. Veja aqui.

Ajuda com select em Firebird

Enviado: 15 Fev 2024 19:01
por alxsts
Olá!

Dependendo da quantidade de registros, um CTE pode degradar a perfonmance.

Ajuste a opção abaixo para a tua necessidade e teste. Está usando as Window Functions (funções analíticas):

Código: Selecionar todos

SELECT 
      d.dtvenc
      extract( day from d.dtvenc ) as dia ,
      SUM( d.saldo ) AS Total ,
      SUM( SUM( d.saldo ) ) OVER ( ORDER BY d.dtvenc ) AS Acumulado
 FROM receberd d
 LEFT JOIN NOTAD n
   ON (d.docum||d.codcli||d.tpnota||d.serie =  n.docum||n.destino||n.tpnota||n.serie )
WHERE d.dtvenc <= '"+ fb_data(dataDeHojeg-10 )
  AND d.dtvenc <= '"+ fb_data(datadehoje) 
  AND d.saldo <> '0' 
  AND n.status <> '04' 
GROUP BY dtvenc, dia
Não tenho como testar.

Ajuda com select em Firebird

Enviado: 02 Abr 2024 08:55
por Poka
Bom dia,

Desculpa a demora pra responder,
Quintas, a sua rotina traz a saldo dos dias anteriores também, então fiz um select para pegar o saldo até o dia anterior e apliquei a sua rotina, já melhorou bastante.

Alexandre, vou testar a sua rotina


Obrigado por responderem


Poka