Sumar registros y almacenar los totales
Hola gente...
Me presento.. me llamo Diego, soy un principiante y tambien este es mi primera post..
Resulta que tengo la siguiente tabla en MySQL:
| id | Col1 | Col2 | Col3 | Col4 | Col5 | Col6 | Total |
Y necesito sumar los campos de las columnas 2, 4 y 5 y almacenar el resultado de cada registro en la columna Total. Necesito que sea con todos los registros y de una sola vez.
Para sumar los registros y mostrar el resultado en el navegador estoy utilizando el siguiente script:
echo "<table width='70%' border='1' cellspacing='2' cellpadding='2'>";
echo "<tr><td>id</td><td>Col2</td><td>Col4</td><td>Col5</td><td>Total</td></tr>";
//consulta los tipos de familia
$consulta="SELECT *, Col2+Col4+Col5 AS total FROM tabla1";
$resultado=mysql_query($consulta);
while ($columnas=mysql_fetch_array($resultado)) {
extract ($columnas);
echo "<tr><td>$id</td><td>$Col2</td><td align='right'>$Col4</td>
<td align='right'>$Col5</td><td align='right'>$total</td></tr>";
}
Con esto consigo que me muestre una tabla en el navegador con todos los registros y las sumas como yo quiero en la columna Total (registro por registro).
Mi problema es que no se como guardar los resultados de cada suma en la columna Total de mi Tabla en la DB.
Intente colocando:
$actualizar="UDPADTE tabla1 SET Total=$total";
mysql_query($actualizar);
Pero con esto solo consigo que guarde en la columna Total de la Tabla de mi DB el mismo valor en todos los registros, que es el valor de la suma del ultimo registro, y no el valor que corresponde a cada suma.
¿Alguien me podria dar una idea de como hacerlo o donde encontrar la info que necesito? (busque por todos lados pero no fui capaz de encontrar lo que necesito)
Gracias a todos
Diego.
Me presento.. me llamo Diego, soy un principiante y tambien este es mi primera post..
Resulta que tengo la siguiente tabla en MySQL:
| id | Col1 | Col2 | Col3 | Col4 | Col5 | Col6 | Total |
Y necesito sumar los campos de las columnas 2, 4 y 5 y almacenar el resultado de cada registro en la columna Total. Necesito que sea con todos los registros y de una sola vez.
Para sumar los registros y mostrar el resultado en el navegador estoy utilizando el siguiente script:
echo "<table width='70%' border='1' cellspacing='2' cellpadding='2'>";
echo "<tr><td>id</td><td>Col2</td><td>Col4</td><td>Col5</td><td>Total</td></tr>";
//consulta los tipos de familia
$consulta="SELECT *, Col2+Col4+Col5 AS total FROM tabla1";
$resultado=mysql_query($consulta);
while ($columnas=mysql_fetch_array($resultado)) {
extract ($columnas);
echo "<tr><td>$id</td><td>$Col2</td><td align='right'>$Col4</td>
<td align='right'>$Col5</td><td align='right'>$total</td></tr>";
}
Con esto consigo que me muestre una tabla en el navegador con todos los registros y las sumas como yo quiero en la columna Total (registro por registro).
Mi problema es que no se como guardar los resultados de cada suma en la columna Total de mi Tabla en la DB.
Intente colocando:
$actualizar="UDPADTE tabla1 SET Total=$total";
mysql_query($actualizar);
Pero con esto solo consigo que guarde en la columna Total de la Tabla de mi DB el mismo valor en todos los registros, que es el valor de la suma del ultimo registro, y no el valor que corresponde a cada suma.
¿Alguien me podria dar una idea de como hacerlo o donde encontrar la info que necesito? (busque por todos lados pero no fui capaz de encontrar lo que necesito)
Gracias a todos
Diego.
Diego,
con el siguiente script lees los registros de tus tablas y haces la suma en variables , ademas la muestras por pantalla y cada vez que lo leas te actualiza los valores
?php
include_once('db.inc.php');
setlocale(LC_MONETARY, 'es_CL');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<head>
<title>UCM_RES</title>
<!-- <link href="../archivos/estilo.css"
rel="stylesheet"> -->
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1">
</head>
<body>
<div align="center"><h4>Servicio General de Mantencion y Reparacion Infraestructura Minas, Division Andina</h4></div>
<div align="center"><h5>Avance Financiero Estado de Pago Nº</h5></div>
<form action="formver.php" name="form" method="post">
<TABLE width="1000" cellspacing="0" border="2" align="center">
<tr>
<td width="50" align="center" cellspacing="0" valign="middle"><strong>Item</strong></td>
<td width="400" align="center" cellspacing="0" valign="middle"><strong>Actividad</strong></td>
<td width="40" align="center" cellspacing="0" valign="middle"><strong>Uni</strong></td>
<td width="110" align="center" cellspacing="0" valign="middle"><strong>Obra Contratada </strong></td>
<td width="110" align="center" cellspacing="0" valign="middle"><b>Obra realizada al E.P Anterior</b></td>
<td width="100" align="center" cellspacing="0" valign="middle"><b>Obra Realizada a la Fecha</b></td>
<td width="100" align="center" cellspacing="0" valign="middle"><b>Precio Unitario $</b></td>
</tr>
<!-- </TABLE> -->
<?php
$sql = 'SELECT * FROM itemizado';
$resultado = ejecutar_sql($sql);
if (mysql_num_rows($resultado)!=0) // controla que haya por lo menos un registro antes de entrar al while.
{
while ( $salida = mysql_fetch_array($resultado) )
{
$item = strval($salida['Item']);
$PU = intval($salida['PU']);
$Q0 = ($salida['Q0']);
$part = $salida['Partida'];
$cor = $salida['Correlativo'];
$uni = $salida['UD'];
$presup = $Q0;
$sql = 'SELECT SUM(Q1) AS suma FROM controlestadopago WHERE Itemm="'.$item.'" GROUP BY Itemm';
$result = ejecutar_sql($sql); // obtiene la suma de Q1 de todos los items de controlestadopago.itemm = itemizado.item
if ( $suma = mysql_fetch_array($result) ) // hay un registro para este item en controlestadopago
{
$totalQ1 = $suma['suma']; // cargo en totalQ1 la suma
$total = $totalQ1 ; // multiplica la suma obtenida en "suma" por el PU obtenido para este itemm
$gral = $gral+$total;
}
else
$total = 0; // cargo 0
$sql = 'SELECT * FROM Ep WHERE item ="'.$item.'"'; // este no se si es por item y si se repiten o no. Si hay un registro solo por item entonces con if estaria, sino debes agregarle un while
$res = ejecutar_sql($sql);
if ( $sal = mysql_fetch_array($res) )
{
$ante = $sal['ant'];
}
else
{
$ante = '';
$act = '';
}
$act = $ante+$total;
echo '<td width="50" cellspacing="0" align="left">'.$item.'</td>';
echo '<td width="397" cellspacing="0" align="left" >'.$part.'</td>';
echo '<td width="35" cellspacing="0" align="center" >'.$uni.'</td>';
echo '<td width="110" cellspacing="0" align="right" >'.number_format($presup,6,',','.') ."n".'</td>';
echo '<td width="110" cellspacing="0" align="right" >'.number_format($ante,3,',','.').'</td>';
echo '<td width="100" cellspacing="0" align="right" >'.number_format($act,3,',','.') ."n".'</td>';
echo '<td width="100" cellspacing="0" align="right" >'.money_format('%!.0n', $PU) ."n".' </td></tr>';
}
}
/*$sant=1000000;
$sact=1000000;
echo '<td width="50" cellspacing="0" align="left"></td>';
echo '<td width="397" cellspacing="0" align="left" >Total Estado de Pago </td>';
echo '<td width="35" cellspacing="0" align="left" ></td>';
echo '<td width="110" cellspacing="0" align="right" ></td>';
echo '<td width="0" cellspacing="0" align="right" >'.intval($sant).' </td>';
echo '<td width="0" cellspacing="0" align="right" >'.intval($sact).' </td>';
echo '<td width="0" cellspacing="0" align="right" >'.intval($gral).' </td></tr>';*/
?>
</TABLE>
</body>
</html>
espero te sirva de ejemplo
Saludos !
con el siguiente script lees los registros de tus tablas y haces la suma en variables , ademas la muestras por pantalla y cada vez que lo leas te actualiza los valores
?php
include_once('db.inc.php');
setlocale(LC_MONETARY, 'es_CL');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<head>
<title>UCM_RES</title>
<!-- <link href="../archivos/estilo.css"
rel="stylesheet"> -->
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1">
</head>
<body>
<div align="center"><h4>Servicio General de Mantencion y Reparacion Infraestructura Minas, Division Andina</h4></div>
<div align="center"><h5>Avance Financiero Estado de Pago Nº</h5></div>
<form action="formver.php" name="form" method="post">
<TABLE width="1000" cellspacing="0" border="2" align="center">
<tr>
<td width="50" align="center" cellspacing="0" valign="middle"><strong>Item</strong></td>
<td width="400" align="center" cellspacing="0" valign="middle"><strong>Actividad</strong></td>
<td width="40" align="center" cellspacing="0" valign="middle"><strong>Uni</strong></td>
<td width="110" align="center" cellspacing="0" valign="middle"><strong>Obra Contratada </strong></td>
<td width="110" align="center" cellspacing="0" valign="middle"><b>Obra realizada al E.P Anterior</b></td>
<td width="100" align="center" cellspacing="0" valign="middle"><b>Obra Realizada a la Fecha</b></td>
<td width="100" align="center" cellspacing="0" valign="middle"><b>Precio Unitario $</b></td>
</tr>
<!-- </TABLE> -->
<?php
$sql = 'SELECT * FROM itemizado';
$resultado = ejecutar_sql($sql);
if (mysql_num_rows($resultado)!=0) // controla que haya por lo menos un registro antes de entrar al while.
{
while ( $salida = mysql_fetch_array($resultado) )
{
$item = strval($salida['Item']);
$PU = intval($salida['PU']);
$Q0 = ($salida['Q0']);
$part = $salida['Partida'];
$cor = $salida['Correlativo'];
$uni = $salida['UD'];
$presup = $Q0;
$sql = 'SELECT SUM(Q1) AS suma FROM controlestadopago WHERE Itemm="'.$item.'" GROUP BY Itemm';
$result = ejecutar_sql($sql); // obtiene la suma de Q1 de todos los items de controlestadopago.itemm = itemizado.item
if ( $suma = mysql_fetch_array($result) ) // hay un registro para este item en controlestadopago
{
$totalQ1 = $suma['suma']; // cargo en totalQ1 la suma
$total = $totalQ1 ; // multiplica la suma obtenida en "suma" por el PU obtenido para este itemm
$gral = $gral+$total;
}
else
$total = 0; // cargo 0
$sql = 'SELECT * FROM Ep WHERE item ="'.$item.'"'; // este no se si es por item y si se repiten o no. Si hay un registro solo por item entonces con if estaria, sino debes agregarle un while
$res = ejecutar_sql($sql);
if ( $sal = mysql_fetch_array($res) )
{
$ante = $sal['ant'];
}
else
{
$ante = '';
$act = '';
}
$act = $ante+$total;
echo '<td width="50" cellspacing="0" align="left">'.$item.'</td>';
echo '<td width="397" cellspacing="0" align="left" >'.$part.'</td>';
echo '<td width="35" cellspacing="0" align="center" >'.$uni.'</td>';
echo '<td width="110" cellspacing="0" align="right" >'.number_format($presup,6,',','.') ."n".'</td>';
echo '<td width="110" cellspacing="0" align="right" >'.number_format($ante,3,',','.').'</td>';
echo '<td width="100" cellspacing="0" align="right" >'.number_format($act,3,',','.') ."n".'</td>';
echo '<td width="100" cellspacing="0" align="right" >'.money_format('%!.0n', $PU) ."n".' </td></tr>';
}
}
/*$sant=1000000;
$sact=1000000;
echo '<td width="50" cellspacing="0" align="left"></td>';
echo '<td width="397" cellspacing="0" align="left" >Total Estado de Pago </td>';
echo '<td width="35" cellspacing="0" align="left" ></td>';
echo '<td width="110" cellspacing="0" align="right" ></td>';
echo '<td width="0" cellspacing="0" align="right" >'.intval($sant).' </td>';
echo '<td width="0" cellspacing="0" align="right" >'.intval($sact).' </td>';
echo '<td width="0" cellspacing="0" align="right" >'.intval($gral).' </td></tr>';*/
?>
</TABLE>
</body>
</html>
espero te sirva de ejemplo
Saludos !
Gracias micknico!
Entiendo que el script consulta la tabla y realiza la suma, pero no almacena en la tabla el resultado de la misma, solo lo muestra en pantalla.
¿o hay algo que se me escapa?
Entiendo que el script consulta la tabla y realiza la suma, pero no almacena en la tabla el resultado de la misma, solo lo muestra en pantalla.
¿o hay algo que se me escapa?
correcto diego, no almacena el resultado ya que se puede obtener cada ves que lo necesites con el calculo de los valores base, ahora para guardar solo tuenes que hacer un
while ($n = campo tabla x )
update table
aunque aun no te entiendo para que quieres guardar los resultados si los puedes calcular cada vez
Saludos !
while ($n = campo tabla x )
update table
aunque aun no te entiendo para que quieres guardar los resultados si los puedes calcular cada vez
Saludos !
Diego independiente de pork lo quieres asi te adjunto el script que uso para guardar y actualizar datos
<?
session_start();
include('config.php');
if($_SESSION['adminUsuario'] || $_SESSION['turnoUsuario']) {
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Guardar Datos</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="archivos/estilo.css" rel="stylesheet">
</head>
<body>
<?
if(isset($actualizar)) {
$var1 = explode('/', ''.$_POST['fechi'].''); list($dia1, $mes1, $ano1) = $var1;
$var2 = explode('/', ''.$_POST['fecht'].''); list($dia2, $mes2, $ano2) = $var2;
$fecha1 = mktime(0,0,0,$mes1,$dia1,$ano1);
$fecha2 = mktime(0,0,0,$mes2,$dia2,$ano2);
$query = "UPDATE trabajos SET ODSCont='$nods', FechInic='".$fecha1."', FechTerm='".$fecha2."', Area='$area', UsuarioSolic='$user', BreveDescrip='".$_POST['desc']."', Turno='$turno', Grupo='$grupo' WHERE ODSCont='$nods'";
mysql_query($query) or die('No se pudo actualizar los datos');
//
for($i = 1; $i < 11; $i++) {
if(!empty($_POST['item'.$i])) {
$query2 = "UPDATE controlestadopago SET ODSCont='$nods', CentroCosto='".$_POST['cc'.$i]."', Grafo='".$_POST['ucm'.$i]."', Itemm='".$_POST['item'.$i]."', Q1='".$_POST['cant'.$i]."', Otm='".$_POST['ot'.$i]."' WHERE Itemm='".$_SESSION['ses_item'.$i]."' AND ODSCont='$nods'";
mysql_query($query2) or die('No se pudo actualizar los datos');
// echo $i.') ODSCont='.$nods.', CentroCosto='.$_POST['cc'.$i].', Grafo='.$_POST['ucm'.$i].', Itemm='.$_POST['item'.$i].', Q1='.$_POST['cant'.$i].', Otm='.$_POST['ot'.$i].', Session Items:'.$_SESSION['ses_item'.$i].'<br>';
}
}
echo '<center>Datos Actualizados<p><a href="index.php">Volver al Inicio</a></center>';
}
if(isset($guardar)) {
$var1 = explode('/', ''.$fechi.''); list($dia1, $mes1, $ano1) = $var1;
$var2 = explode('/', ''.$fecht.''); list($dia2, $mes2, $ano2) = $var2;
$fecha1 = mktime(0,0,0,$mes1,$dia1,$ano1);
$fecha2 = mktime(0,0,0,$mes2,$dia2,$ano2);
$query = "INSERT INTO trabajos values ('', '$nods', '', '$fecha1', '$fecha2', '$area', '', '$user', '$desc', '$turno', '$grupo')";
mysql_query($query) or die('No se pudo agregar los datos 1');
for($i = 1; $i < 11; $i++) {
if(!empty($_POST['item'.$i])) {
$query2 = "INSERT INTO controlestadopago values ('', '".$nods."', '".$_POST['cc'.$i]."', '".$_POST['ucm'.$i]."', '".$_POST['item'.$i]."', '".$_POST['cant'.$i]."', '".$_POST['ot'.$i]."')";
mysql_query($query2) or die('No se pudo agregar los datos 2');
//Mensaje de datos guardados.
//echo $nods.','.$_POST['cc'.$i].','.$_POST['ucm'.$i].','.$_POST['item'.$i].','.$_POST['cant'.$i].','.$_POST['ot'.$i].'<br>';
}
}
echo '<center>Datos Guardados correctamente.<br><a href="index.php">Volver</a></center>';
}
?>
</body>
</html>
<?
} else { include('error.html'); }
?>
Espero aclare tus dudas
Saludos!
<?
session_start();
include('config.php');
if($_SESSION['adminUsuario'] || $_SESSION['turnoUsuario']) {
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Guardar Datos</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="archivos/estilo.css" rel="stylesheet">
</head>
<body>
<?
if(isset($actualizar)) {
$var1 = explode('/', ''.$_POST['fechi'].''); list($dia1, $mes1, $ano1) = $var1;
$var2 = explode('/', ''.$_POST['fecht'].''); list($dia2, $mes2, $ano2) = $var2;
$fecha1 = mktime(0,0,0,$mes1,$dia1,$ano1);
$fecha2 = mktime(0,0,0,$mes2,$dia2,$ano2);
$query = "UPDATE trabajos SET ODSCont='$nods', FechInic='".$fecha1."', FechTerm='".$fecha2."', Area='$area', UsuarioSolic='$user', BreveDescrip='".$_POST['desc']."', Turno='$turno', Grupo='$grupo' WHERE ODSCont='$nods'";
mysql_query($query) or die('No se pudo actualizar los datos');
//
for($i = 1; $i < 11; $i++) {
if(!empty($_POST['item'.$i])) {
$query2 = "UPDATE controlestadopago SET ODSCont='$nods', CentroCosto='".$_POST['cc'.$i]."', Grafo='".$_POST['ucm'.$i]."', Itemm='".$_POST['item'.$i]."', Q1='".$_POST['cant'.$i]."', Otm='".$_POST['ot'.$i]."' WHERE Itemm='".$_SESSION['ses_item'.$i]."' AND ODSCont='$nods'";
mysql_query($query2) or die('No se pudo actualizar los datos');
// echo $i.') ODSCont='.$nods.', CentroCosto='.$_POST['cc'.$i].', Grafo='.$_POST['ucm'.$i].', Itemm='.$_POST['item'.$i].', Q1='.$_POST['cant'.$i].', Otm='.$_POST['ot'.$i].', Session Items:'.$_SESSION['ses_item'.$i].'<br>';
}
}
echo '<center>Datos Actualizados<p><a href="index.php">Volver al Inicio</a></center>';
}
if(isset($guardar)) {
$var1 = explode('/', ''.$fechi.''); list($dia1, $mes1, $ano1) = $var1;
$var2 = explode('/', ''.$fecht.''); list($dia2, $mes2, $ano2) = $var2;
$fecha1 = mktime(0,0,0,$mes1,$dia1,$ano1);
$fecha2 = mktime(0,0,0,$mes2,$dia2,$ano2);
$query = "INSERT INTO trabajos values ('', '$nods', '', '$fecha1', '$fecha2', '$area', '', '$user', '$desc', '$turno', '$grupo')";
mysql_query($query) or die('No se pudo agregar los datos 1');
for($i = 1; $i < 11; $i++) {
if(!empty($_POST['item'.$i])) {
$query2 = "INSERT INTO controlestadopago values ('', '".$nods."', '".$_POST['cc'.$i]."', '".$_POST['ucm'.$i]."', '".$_POST['item'.$i]."', '".$_POST['cant'.$i]."', '".$_POST['ot'.$i]."')";
mysql_query($query2) or die('No se pudo agregar los datos 2');
//Mensaje de datos guardados.
//echo $nods.','.$_POST['cc'.$i].','.$_POST['ucm'.$i].','.$_POST['item'.$i].','.$_POST['cant'.$i].','.$_POST['ot'.$i].'<br>';
}
}
echo '<center>Datos Guardados correctamente.<br><a href="index.php">Volver</a></center>';
}
?>
</body>
</html>
<?
} else { include('error.html'); }
?>
Espero aclare tus dudas
Saludos!
Amigazo, con el SQL que tienes obviamente almacenara el ultimo registro que tienes en tu suma y se los pegara a cada registro...
$actualizar="UDPADTE tabla1 SET Total=$total";
mysql_query($actualizar);
lo que debes agregar a tu SQL es la clausula 'WHERE' y en esta colocar el identificador de cada columna para que asi reemplace por cada columna el valor de cada suma de la fila.
$actualizar="UDPADTE tabla1 SET Total=$total" .
"WHERE id = $id";
mysql_query($actualizar);
y obviamente todo esto dentro de un while para que se haga registro por registro.
$actualizar="UDPADTE tabla1 SET Total=$total";
mysql_query($actualizar);
lo que debes agregar a tu SQL es la clausula 'WHERE' y en esta colocar el identificador de cada columna para que asi reemplace por cada columna el valor de cada suma de la fila.
$actualizar="UDPADTE tabla1 SET Total=$total" .
"WHERE id = $id";
mysql_query($actualizar);
y obviamente todo esto dentro de un while para que se haga registro por registro.