Página 1 de 1

Ordem do cálculo

Enviado: 08 Jan 2024 13:15
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

Ordem do cálculo

Enviado: 08 Jan 2024 14:43
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

Ordem do cálculo

Enviado: 08 Jan 2024 19:18
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.

Ordem do cálculo

Enviado: 09 Jan 2024 08:28
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

Ordem do cálculo

Enviado: 22 Mar 2024 14:23
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!

Ordem do cálculo

Enviado: 22 Mar 2024 18:47
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.

Ordem do cálculo

Enviado: 24 Mar 2024 10:06
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!