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 1stVieira
      Olá a todos! Estou com uma dúvida em relação a realizar um cadastro no banco de dados (SQL) a partir de um formulário de um projeto.
       
      Possuo duas tabelas, Categoria e Itens, na qual a tabela Itens possui uma FOREIGN KEY com a tabela Categorias.
       
      Na página de Categorias consigo realizar os cadastro das mesmas sem problemas e elas estão sendo aplicadas em um SELECT na página de Cadastro dos Itens. O problema está sendo cadastrar os Itens no Banco de Dados. Estou utilizando PHP Orientado à Objetos
       
      Página de Adição de Pedidos
      <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Adição de Item</title> </head> <body> <div> <a href="modificarCardapio.php" class="link_home"><i class="fa fa-home"></i></a> </div> <div> <div> <h1>Adicionar Itens ao Cardápio</h1> </div> <div> <form action="#" method="POST"> <label>Categoria:</label> <select name="selecionarcat"> <option selected>Selecione a Categoria</option> <?php require_once"../models/conexao.class.php"; require_once"../models/categoriaDAO.class.php"; $catDAO = new categoriaDAO(); $ret = $catDAO->buscarTodasCategorias(); if(count($ret) > 0){ foreach ($ret as $dado){ echo "<option value='".$dado->idcategoria."'>".$dado->descritivo."</option>"; } } ?> </select> <br><br> <a href="addcategoria.php"><input type="button" value="Adicionar nova Categoria"></a> <p> <label>Nome do Item: </label> <input type="text" name="nomeproduto"> </p> <p> <label>Descrição: </label> <input type="text" name="descricao"> </p> <p> <label>Preço: </label> <input type="text" name="preco"> </p> <br> <input type="submit" value="Adicionar"> </form> </div> </div> </body> </html> <?php if($_POST){ require_once "../models/conexao.class.php"; require_once "../models/item.class.php"; require_once "../models/itemDAO.class.php"; $item = new item(null, $_POST["nomeproduto"], $_POST["descricao"], null, $_POST["preco"]); $itemDAO = new itemDAO(); $itemDAO->adicionar($item); header("Location:modificarCardapio.php"); } ?> ItemDAO.php
      <?php class itemDAO extends conexao{ function __construct(){ parent:: __construct(); } function adicionar($item){ $sql="INSERT INTO itens (nomeprod, descricao, preco, id_categoria) VALUES(?, ?, ?, ?)"; try{ $stm = $this->db->prepare($sql); $stm->bindValue(1, $item->getNomeproduto()); $stm->bindValue(2, $item->getDescricao()); $stm->bindValue(3, $item->getPreco()); $stm->bindValue(4, $item->getCategoria()); $stm->execute(); $this->db = null; } catch(Exception $e){ die($e->getMessage()); } } ?> Item.class.php
      <?php class item{ private $iditem; private $nomeproduto; private $descricao; private $categoria; private $preco; function __construct($iditem, $nomeproduto, $descricao, $categoria, $preco){ $this->iditem=$iditem; $this->nomeproduto=$nomeproduto; $this->descricao=$descricao; $this->categoria=$categoria; $this->preco=$preco; } function getIditem(){ return $this->iditem; } function getNomeproduto(){ return $this->nomeproduto; } function getDescricao(){ return $this->descricao; } function getCategoria(){ return $this->categoria; } function getPreco(){ return $this->preco; } function setIditem($iditem){ $this->iditem=$iditem; } function setNomeproduto($nomeproduto){ $this->nomeproduto=$nomeproduto; } function setDescricao($descricao){ $this->descricao=$descricao; } function setCategoria($categoria){ $this->categoria=$categoria; } function setPreco($preco){ $this->preco=$preco; } } ?>  
    • By marlone
      Preciso fazer uma consulta no banco onde eu pego total gasto por CPF, somando cada row que for do mesmo CPF por exemplo:
       
       
      Cpf    ctro    vlr               vlrtotal
      158   166     1000         5000
      158   156     1000         5000
      158   1644   3000        5000
       
      159   168     2000         6000
      159   154     2000         6000
      159   111     2000         6000
       
      É possível?
    • By wandoh
      Boa Tarde! estou com um dificuldades de puxar os dados do usuário logado no site. Atualmente estou conseguindo puxar somente o NOME, quando tento puxar o restante da erro! Abaixo segue o Código.
       
      session_start(); //inicializa variaveis $id = "accountid"; $name = ""; $email = ""; $errors = array(); //conexão db $db = mysqli_connect('localhost', 'root', 'senha', 'db') or die("could not connect to database"); //Registrar usuário if (isset($_POST['reg_user'])) { // receives all input values from the form $name = mysqli_real_escape_string($db, $_POST['name']); $email = mysqli_real_escape_string($db, $_POST['email']); $password = mysqli_real_escape_string($db, $_POST['password']); $password2 = mysqli_real_escape_string($db, $_POST['password2']); //form validação: ensure that the form is correctly filled ... // by adding (array_push)) corresponding error unto $errors array if(empty($name)) { array_push($errors, " "); } if(empty($email)) { array_push($errors, " "); } if(empty($pwd)) { array_push($errors, " "); } if($pwd != $pw2) { array_push($errors, " "); } // To protect MySQL injection (more detail about MySQL injection) $name = stripslashes($name); $password = stripslashes($password); // first check the databese to make sure // verifica na db se a usuário existente com o mesmo nome de usuário e email $user_check_query = "SELECT * FROM t_account WHERE name='$name' or email='$email' LIMIT 1"; $result = mysqli_query($db, $user_check_query); $user = mysqli_fetch_assoc($result); if($user) { // if user existente if ($user['name'] === $name) { array_push($errors, " "); } if ($user['email'] === $email) { array_push($errors, " "); } } // Registra o usuário se não haver erros if (count($errors) == 0 ) { $pwd = md5($pwd); print $pwd; $query = "INSERT INTO t_account (name, email, pwd, pw2) VALUES ('$name', '$email', '$password', '$password2')"; mysqli_query($db, $query); $_SESSION['accountid'] = $id;// $_SESSION['name'] = $name; $_SESSION['success'] = 'Você está logado em'; echo " "; //header('location: index.php'); } } //LOGIN USER if (isset($_POST['login_user'])) { $name = mysqli_real_escape_string($db, $_POST['name']); $password = mysqli_real_escape_string($db, $_POST['password']); if (empty($name)) { array_push($errors, " "); } if (empty($password)) { array_push($errors, " "); } if (count($errors) == 0 ) { $pwd = md5($pwd); $query = "SELECT 'email' FROM t_account WHERE name='$name' AND password='$password'"; $results = mysqli_query($db, $query); if (mysqli_num_rows($results)) { $_SESSION['accountid'] = $id;// $_SESSION['name'] = $name; $_SESSION['success'] = 'Você está logado em'; echo " "; //header('location: index.php'); }else{ array_push($errors, " "); } } } Com a variável abaixo, é exibido o nome de quem esta logado.
      $_SESSION["name"] Já com os demais, não e exibido o resultado é apresentado uma msg de erro.
      $_SESSION["email"] Notice: Undefined index: email in Passei em todos os post que tem sobre o assunto, mas infelizmente em meu código não deu certo.
       Sou novo em PHP!
      Preciso puxar todos os dados cadastrado do usuário.
    • By Mauricio Molina
      Boa tarde.
       
      Ainda sou iniciante, se puderem me ajudar agradeço!
       
      Estou com uma dificuldade em manter a opção selecionada no  campo select, após salvar os dados em duas situações distintas:
       
      O que mais preciso fazer?
       
      <div class="col-md-2 col-sm-2 col-xs-7"> <div class="form-group"> <label for="config_horario_domingoferiado">Domingo e Feriado<span class="text-danger">*</span></label> <select name="config_horario_domingoferiado" id="config_horario_domingoferiado" class="form-control" value="<?= $data['config']->config_horario_domingoferiado ?>" required> <option>Aberto</option> <option>Fechado</option> </select> </div> </div> <div class="col-md-3 col-sm-3 col-xs-12"> <div class="form-group"> <label for="imovel_financ">Bandeiras<span class="text-danger">*</span></label> <select name="imovel_financ" id="imovel_financ" class="form-control"> <option value=" ">Selecione...</option> <option value="Aceita Financiamento">Aceita Financiamento</option> <option value="Alugado">Alugado</option> <option value="Frente para Mar">Frente para Mar</option> <option value="Lançamento">Lançamento</option> <option value="Oportunidade">Oportunidade</option> </select> </div> </div>  
    • By asacap1000
      Galera salve a todos.
       
      Gostaria de saber se é possivel e se for como fazer.  Tenho um select de faturamento, e nesta consulta ele me traz o numero da NF, ele me traz os ítens faturados. Gostaria de saber se´no próprio select é possível trazer o numero da NF apenas uma vez, e nas outras linhas que estarão vindo os ítens cobrados estes campos ficarem vazios.
       
      Segue exemplo hoje como está e como eu preciso.
       

       
      Como eu preciso:
       

       
       
      Abaixo o select
       
      SELECT A.ID_KLIENT COD, K.NAME NOME, A.BILLITE ITEM, I.DESCRIPTION DESC_ITEM, SUM(A.MNG) QUANT, SUM(ROUND(A.PREIS, 3)) VALOR, BO.NR_NF NF FROM BILL_OS_ITEM A, BILL_ITEM I, KLIENTEN K, BILL_OS BO, (SELECT T.DOCSVE_REF, D.DOCHD_DOC_ID FROM FISCAL.DOCSVE T, FISCAL.DOCHD D WHERE T.DOCSVE_DOC_PRC_ID = D.DOCHD_DOC_PRC_ID) REFE WHERE I.BILLITE = A.BILLITE AND A.ID_KLIENT = K.ID_KLIENT AND BO.NR_NF = REFE.DOCHD_DOC_ID(+) AND BO.ID_KLIENT = K.ID_KLIENT AND BO.STATUS <> '80' AND BO.ID_OS = A.ID_OS AND TRUNC(BO.DATE_EMISS) >= TO_DATE('01/09/2019', 'DD/MM/YYYY') AND TRUNC(BO.DATE_EMISS) <= TO_DATE('30/09/2019', 'DD/MM/YYYY') GROUP BY A.ID_KLIENT, K.NAME, A.BILLITE, I.DESCRIPTION, BO.NR_NF, BO.LOTE, REFE.DOCSVE_REF ORDER BY K.NAME, A.ID_KLIENT, A.BILLITE  
×

Important Information

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