Jump to content
Lucas Guima

Buscar registros por soma

Recommended Posts

E aí, galera!

 

Gostaria de pedir a ajuda de vocês com uma questão que eu já havia escutado falar, mas nunca trabalhei. Até agora.

 

Vamos imaginar o extrato de um cartão corporativo, onde necessita-se prestar contas de todas transações. Com compras é tranquilo, ele especifica o gasto e pronto.

 

O ponto está nas transações de saque, pois o portador pode não ter gastado todo o valor sacado, ficando com um saldo residual.

 

Saldo este que ele poderá lançar como gasto em uma outra data, porém, ele pode ter um acumulado de saldo residual, de 1 ou mais saques.

 

Estou registrando cada resíduo por saque, para cada portador, vamos supor, ele fez 4 saques que restaram os seguintes valores:

 

 

R$ 5,00

R$ 10,00

R$ 7,00

R$ 3,00

 

Ou seja, ele tem um saldo residual total de R$ 25,00.

 

Então numa determinada data ele fez uma compra com esse saldo de R$ 20,00, aqui está minha dúvida.

 

Quero buscar no banco de dados os registros que são necessários para compor esse valor de R$ 20,00.

 id | portador_id | residuo
  1 |      32     |  5.00
  2 |      32     |  10.00
  3 |      32     |  7.00
  4 |      32     |  3.00

Preciso dos 3 primeiros registros, que ao todo somam R$ 22,00, suficientes para abater os R$ 20,00 do gasto do portador.

 

Como diz o título do tópico, a questão é buscar registros por soma.

 

Agradeço desde já!

 

:D

Share this post


Link to post
Share on other sites

Desculpe, mas neste caso o usuário não fez, teoricamente, uma transferência do banco para a carteira? Não facilitaria? Pois seria um pagamento á vista, acho eu.

Share this post


Link to post
Share on other sites

Desculpe, mas neste caso o usuário não fez, teoricamente, uma transferência do banco para a carteira? Não facilitaria? Pois seria um pagamento á vista, acho eu.

 

Não entendi sua colocação.

 

 

Veja se ajuda

 

Valeu Motta, vou dar uma lida aqui.

Share this post


Link to post
Share on other sites

não me pergunte sobre implementação , nunca fiz isto apenas me lembrei do algoritmo.

Share this post


Link to post
Share on other sites

A baixa pode ser parcial ,

 

poderia

ordenar por valor (asc)

4 | 32 | 3.00
1 | 32 | 5.00
3 | 32 | 7.00
2 | 32 | 10.00

ir baixando enquanto houve saldo

                         (20,00)
4 | 32 | 3.00      0,00 (17,00)
1 | 32 | 5.00      0,00 (12,00)
3 | 32 | 7.00      0,00 ( 5,00)
2 | 32 | 10.00     5,00 (0,00)

No fim ou sobraria saldo a baixar ou saldos sem baixa.

Share this post


Link to post
Share on other sites

Acontece que a ideia é dar baixa pelo histório, vindo do saldo mais antigo para o mais novo.

 

O que eu consegui foi buscar o último a ser debitado, com um bocado de IFs.

 

Prevendo os seguintes cenários:

 

- O valor da compra pode ser menor que o primeiro saldo.

- O valor da compra pode ser igual ao primeiro saldo.

- O valor da compra pode ser igual a soma de N saldos.

- O valor da compra pode ser menor que a soma de N saldos anteriores ao atual do SELECT E maior que a soma de N saldos anteriores incluindo o atual.

SET @price = 2;

SELECT 
    *
FROM
    `statement_residue` `SR`
WHERE
    IF (
        (SELECT SUM(`SR1`.`amount`) FROM `statement_residue` `SR1` WHERE `SR1`.`id` < `SR`.`id`) IS NULL,
        IF(
            (SELECT SUM(`SR2`.`amount`) FROM `statement_residue` `SR2` WHERE `SR2`.`id` = `SR`.`id`) = @price, 1,
            IF((SELECT SUM(`SR3`.`amount`) FROM `statement_residue` `SR3` WHERE `SR3`.`id` = `SR`.`id`) > @price, 1, 0)
        ),
        IF (
            (SELECT SUM(`SR4`.`amount`) FROM `statement_residue` `SR4` WHERE `SR4`.`id` <= `SR`.`id`) = @price, 1,
            IF ((SELECT SUM(`SR5`.`amount`) FROM `statement_residue` `SR5` WHERE `SR5`.`id` < `SR`.`id`) < @price,
                IF ((SELECT SUM(`SR6`.`amount`) FROM `statement_residue` `SR6` WHERE `SR6`.`id` <= `SR`.`id`) > @price, 1, 0),
            0)
        )
    )

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Giovanird
      Olá amigos!
      Tenha a seguinte estrutura no banco MySQL
      COD   |   PONTOX  |  PONTOY  |  ATLETAX       |  ATLETAY
      1         |   0               |  1               |  Maria              |  João
      2         |   2               |  0               |  João               |  Maria
      3         |   0               |  2               |  Maria              |  João
      4         |   7               |  5               |  Maria              |  João
      5         |   0               |  3               |  João               |  Maria
      6         |   2               |  1               |  João               |  Maria
      7         |   0               |  6               |  Maria              |  João
      8         |   4               |  0               |  João               |  Maria
       
      Preciso de ajuda para somar quantos pontos fez o atleta João nos últimos 5 torneios (COD 8, 7, 6, 5 e 4)  Há momento que o João jogou em X e outro momento em Y.
      Abaixo segue meu Select, onde a soma dos pontos deve ser 17.
       
      nomeatleta = "João"
      Set soma= banco.execute("SELECT sum(PONTOX ) AS somax,  sum(PONTOY ) AS somay FROM (select cod, pontox, pontoy, atletax, atletay  from torneios where (atletax like '"&nomeatleta&"' or atletay like '"&nomeatleta&"') order by cod desc limit 5) AS temp")
       
    • By Marcones Borges
      Olá, bom dia, estou tendo dificuldade em uma filtragem, quando passo o parâmetro para o select em forma de variável ele não exibe resultados.
       
      Segue o código:

              $usuario='gerente';         function montaSelect()         {         $sql = "SELECT * FROM membros WHERE user='".$usuario."' ";                 $query = mysql_query( $sql );                 if( mysql_num_rows( $query ) > 0 )                 {                         while( $dados = mysql_fetch_assoc( $query ) )                         {                                 $opt .= '<option value="'.$dados['nome'].'">'.$dados['nome'].'</option>';                         }                 }                 else                         $opt = '<option value="0">Nenhum Membro cadastrado</option>';                 return $opt;         }


      Quando substituo a variável pelo nome usuário gerente, ele lista normal, mais na variável não da certo. já tentei user='{$usuario}'  , user='$usuario' , user=$usuario}, nenhuma forma funciona...

      Alguém pode me ajudar..
       
    • By Marcones Borges
      Olá boa tarde!
      Tenho 3 select e não estou conseguindo habilita-los pela seleção a ideia é selecionar tipo 1 habilita select 1, 2 habilita select 2.

        <select class="form-control input-sm" name="principal" id="principal">                       <option value="select1">Ativa select 1</option>                         <option value="select2">Ativa select 2</option>                       </select>   <select class="form-control input-sm" name="select1" id="select1">                       <option value="opção 1">opção 1</option>                         <option value="opção 2">opção 2</option>                         <option value="opção 3">opção 3</option>                       </select>   <select class="form-control input-sm" name="select2" id="select2">                       <option value="opção 7">opção 7</option>                         <option value="opção 8">opção 8</option>                         <option value="opção 9">opção 9</option>                       </select> //Java script <script type='text/javascript'> var principal = $("#principal"); var select1 = $("#select1"); var select2 = $("#select2"); inst.bind("input", function () {     principal.val("");     select1.val("");     select1.attr("list", null)     var option = $(inst.prop("list")).find("option[value='" + inst.val() + "']");     if (option != null && option.length > 0) {         principal.attr("list", "_" + option.attr("data-value"));     } else {                 principal.attr("list", null)     } }); </script>  
       
      Não consigo colocar pra funcionar...
       
      alguém me ajude um! 
       
    • By Diego-SLP
      Bom dia,
       
      Tenho uma pagina para editar meus registros do banco e em um campo select o que está definido no banco de dados não aparece selecionado, vem com um valor em branco, sendo que meu ID e meu VALOR para esta tela é o mesmo campo, nao estou utilizando ID e VALOR.
       
      <!--INICIO FORMULARIO PESQUISAR DOSAGEM--> <form action="atualizar_movcbuq.php?id=<?php echo $_GET['id']; ?>" method="post" name="pesquisar" > <?php $busca = mysqli_query($con,"SELECT data,faixa,ticket,quantidade,obra_cliente,horae,horas,placa,operacao from dosagem_usina where id ='".$_GET['id']."'"); while ($linha = mysqli_fetch_array($busca)) { $data = date('d/m/Y', strtotime($linha['data'])); $faixa = $linha['faixa']; $ticket = $linha['ticket']; $quantidade = $linha['quantidade']; $obra = $linha['obra_cliente']; $horae = $linha['horae']; $horas = $linha['horas']; $placa = $linha['placa']; ?> <!--INICIO CAMPO--> <div class="col-2"> <label>Faixa</label> <div class="input-group-prepend"> <span class="input-group-text"><i class="fas fa-list-ol"></i></span> <select class="form-control" name="faixa" style="width: 100%;" data-select2-id="1" aria-hidden="true"> <?php $preenche_faixa = mysqli_query($con,"select faixa from dosagem_usina group by faixa"); while($dados = mysqli_fetch_assoc($preenche_faixa)) { echo "<option value='".$dados['faixa']."' >".$dados['faixa']."</option>"; } ?> </select> </div> </div> <!--FIM CAMPO--> <?php } ?>  
    • By Public2004
      Boas. Gostaria da ajuda dos colegas para analisar a possibilidade de otimizar a seguinte situação: Tenho um "select" simples para trazer um registro específico e que atenda uma determinada condição (where) - Após este "select", recupero o "id" deste registro e utilizo para fazer mais dois "select", um para trazer o registro anterior e  outro para o próximo (id) utilizando MIN e MAX. Tem como fazer tudo isso em um único "select" ?
       
      Tks.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.