Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Como calcular valores dentro de um único campo? Calcular expressões.

Tenho algumas expressões no banco de dados mysql em um único campo, e gostaria de saber como calcular.

Exemplo das fórmulas: (((1075.55297726+0+(0/3652.13632711))/1043.33643911)-1)/(1/((1075.55297726*3652.13632711)/0))

8 respostas

Olá Lucas!

Acho que não entendi completamente sua dúvida. Você tem esses dados num único campo, e quer realizar essas operações é isso? Se for isso, você deve utilizar algum agrupamento, você deve fazer um agrupamento por algum dos campos e no SELECT realizar esse cálculo. Quanto a expressão em si, é muito semelhante, você deve usar os parênteses para determinar a ordem das operações, quem deve ser feito primeiro, e os os outros operadores também são dessa forma.

Se não é essa sua dúvida, explica melhor e se possível coloca mais detalhes pra gente poder ajudar!

Então, eu tenho várias dessas expressões no banco de dados, sendo uma expressão em cada célula, quando eu faço assim, direto no select, calcula,

select (230862.24999999997+135576.52+125862.26+103221.79000000001+94897.36999999997+86882.22000000002+73807.09999999999+64709.4+46501.36+38874.340000000004)/2735433.21

resultado: 0.3660095250506957

Mas quando eu faço isso: select teste.tbindicadoresfidc3.formulaSubstituir from teste.tbindicadoresfidc3, não calcula.

Todas as expressões estão na coluna formulaSubstituir, mas eu não consigo calcular.

Se eu entendi bem, "formulaSubstituir" é o campo onde vc tem a expressão é isso? Então o que você poderia fazer era utilizar uma função, assim você iria fornecer os dados esperando obter um retorno, acho que seria a solução ideal, porém não sei se você já viu essa parte em algum dos cursos de bancos de dados aqui da Alura.

Mas, nesse campo "formulaSubstituir", contém toda a expressão:

(230862.24999999997+135576.52+125862.26+103221.79000000001+94897.36999999997+86882.22000000002+73807.09999999999+64709.4+46501.36+38874.340000000004)/2735433.21

Já salva no banco de dados? E está salva já com os parênteses, operadores matemáticos? É isso ? Por que se for então você vai ter dividir e converter os dados para poder realizar o cálculo ou enviar para a função como parâmetro.

Sim, vou ter que me virar, pois existem as mais diversas fórmulas possíveis, sendo algumas, gigantescas.

Olá Lucas!

É realmente você vai ter um pouco de trabalho porque os dados estão todos salvos em um único campo, ai realmente não vejo alternativa, mais felizmente existe soluções!

Consegui resolver usando PHP e o banco.

$substituirTbIndicadoresFidc3_ = $conn->prepare(" select (" . $formulaSubstituir . ") as valor; "); $substituirTbIndicadoresFidc3_->execute();

while($row = $substituirTbIndicadoresFidc3_->fetch(PDO::FETCH_ASSOC)){
    $valor = $row["valor"];

Pego a expressão inteira, executa ela sozinha no select e pego o resultado pelo PHP.

Show de bola Lucas!

Que bom que conseguiu, não pude de dar uma resposta mais objetiva porque não conheço bem o seu cenário! Mas o importante é que você conseguiu, muito bom e obrigado por compartilhar a solução!!

solução!

Só vou melhorar minha pergunta e resposta.

Tenho uma tabela de expressões no MySQL.

Seguem três exemplos das várias expressões que possuo:

A) (((1598.39640165+0+(0/4853.93003386))/1576.07019804)-1)/(1/((1598.39640165*4853.93003386)/0))

B) (27054.76673436*111.82789404)/1000

C)(195064.41+173182.56+126566.82+113378.04999999999+99528.81+98537.55+92403.84+89775.27+86639.57000000002+84111.09+79466.78+78365.68+77493.75+75210.06+71980.86+68751.37+61878.849999999984+59396.67+56711.29+54465.65)/10841379.25

Cada uma dessas expressões, estão dentro de um campo na coluna formulaSubstituir da tabela do MySQL.

Eu não estava conseguindo calcular direto no PHP e nem no MySQL. Achei que teria que montar uma função ou no P|HP ou no banco, separando os operadores aritméticos para calcular os números das expressões por parte, de forma separada.

Mas, executando cada expressão separada no select, exemplo --> "select (27054.76673436*111.82789404)/1000", consegui obter o resultado.

Então abaixo, segue como eu fiz:

/**

  • Pego as expressões da tabela no campo formulaSubstituir. */ $substituirTbIndicadoresFidc3 = $conn->prepare(" SELECT * FROM tabela; "); $substituirTbIndicadoresFidc3->execute();

while($row = $substituirTbIndicadoresFidc3->fetch(PDO::FETCH_ASSOC)){

$formulaSubstituir = $row["formulaSubstituir"];

/**
 * Executo no Select cada expressão de forma separada, apelidando de valor o resultado.
 */
$substituirTbIndicadoresFidc3_ = $conn->prepare("    select (" . $formulaSubstituir  . ") as valor;      ");
$substituirTbIndicadoresFidc3_->execute();

/**
 * Pego a resposta do select acima e obtenho o valor.
 */
while($row = $substituirTbIndicadoresFidc3_->fetch(PDO::FETCH_ASSOC)){
    $valor = $row["valor"];

echo '-------------->>>>>>>>' . "Fórmula para cálculo: $valor". "<br /><br /><br /><br /><br /><br /><br /><br />"; 

};

}; };

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software