Ajuda com select em Firebird

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

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 em Firebird

Mensagem 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
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 em Firebird

Mensagem 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.
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 em Firebird

Mensagem por Poka »

Obrigado Quintas, vou testar aqui


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 em Firebird

Mensagem 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.
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Ajuda com select em Firebird

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Ajuda com select em Firebird

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
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 em Firebird

Mensagem 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
Responder