Ordem do cálculo

Forum sobre SQL.

Moderador: Moderadores

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

Ordem do cálculo

Mensagem por JoséQuintas »

Código: Selecionar todos

      :cSQL := "SELECT" + ;
         " BADATBAN, BADATEMI, BARESUMO, BAHIST, " + ;
         " IF( BAVALOR > 0, BAVALOR, 0 ) AS ENTRADA," + ;
         " IF( BAVALOR < 0, BAVALOR, 0 ) AS SAIDA," + ;
         " @SOMA := @SOMA + BAVALOR AS SALDO" + ;
         " FROM" + ;
         " ( SELECT BADATBAN, BADATEMI, BARESUMO, BAHIST, BAVALOR, IDBANCARIO FROM JPBANCARIO" + ;
         " WHERE BAVALOR <> 0"  + ;
         " ORDER BY BADATBAN, BADATEMI, IDBANCARIO ) AS B" + ;
         " ORDER BY BADATBAN, BADATEMI, IDBANCARIO"
O cálculo não obedece o order by
Tentei usar sub-query, mas não resolveu.

Alguma idéia?

nota:
o cálculo é cumulativo, mas segue a ordem natural da tabela, e não o order by definido
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/
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Ordem do cálculo

Mensagem por ivanil »

Ordem de execução do motor mysql:
1. FROM
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. ORDER BY
7. LIMIT
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ordem do cálculo

Mensagem por JoséQuintas »

Mesmo assim:

Código: Selecionar todos

 " FROM" + ;
         " ( SELECT BADATBAN, BADATEMI, BARESUMO, BAHIST, BAVALOR, IDBANCARIO FROM JPBANCARIO" + ;
         " WHERE BAVALOR <> 0"  + ;
         " ORDER BY BADATBAN, BADATEMI, IDBANCARIO ) AS B" + ;
Achei que essa sub-query seria criada primeiro antes da outra.
Essa deixaria já na ordem necessária.
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/
marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

Ordem do cálculo

Mensagem por marco.prodata »

Tenta com CTE

Código: Selecionar todos

WITH
  cte1 AS (SELECT a, b FROM table1),
  cte2 AS (SELECT c, d FROM table2)
SELECT b, d FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;
https://dev.mysql.com/doc/refman/8.0/en/with.html
MrBombastic1
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 22 Mar 2024 13:28
Localização: Sao Paulo

Ordem do cálculo

Mensagem por MrBombastic1 »

Parece que o problema está relacionado ao cálculo cumulativo não seguindo a ordem definida no ORDER BY. Uma possível solução seria usar a função de janela SUM() em vez de uma variável de usuário (@SOMA) para calcular o saldo cumulativo. Isso deve garantir que o cálculo siga a ordem correta definida no ORDER BY. Aqui está um exemplo de como você pode ajustar seu código:

Código: Selecionar todos

SELECT
    BADATBAN,
    BADATEMI,
    BARESUMO,
    BAHIST,
    IF( BAVALOR > 0, BAVALOR, 0 ) AS ENTRADA,
    IF( BAVALOR < 0, BAVALOR, 0 ) AS SAIDA,
    SUM(BAVALOR) OVER (ORDER BY BADATBAN, BADATEMI, IDBANCARIO) AS SALDO
FROM
    JPBANCARIO
WHERE
    BAVALOR <> 0
ORDER BY
    BADATBAN, BADATEMI, IDBANCARIO
Espero que isso ajude a resolver seu problema!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ordem do cálculo

Mensagem por JoséQuintas »

Legal isso, achei até mais opções.

https://learnsql.com/blog/sum-over-partition-by/

Mas aqui caiu no problema da versão do servidor.
Num servidor com mariadb 10.x aceitou, mas em outro com mysql 5.6 não.
Só depois que atualizar todos.
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/
MrBombastic1
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 22 Mar 2024 13:28
Localização: Sao Paulo

Ordem do cálculo

Mensagem por MrBombastic1 »

Espero que essa sugestão ajude a resolver seu problema! Se precisar de mais alguma coisa, fique à vontade para me perguntar, estou sempre disponível no chat jogo plinko. Desejo-lhe boa sorte e mais sucesso na programação!
Responder