berekening tabel over 2 rows

Status
Niet open voor verdere reacties.

vogeltje39

Gebruiker
Lid geworden
27 sep 2006
Berichten
13
previous row.png

http://www.helpmij.nl/forum/attachment.php?attachmentid=242747&d=1438350078

Waar ik niet uit kom en graag wat hulp bij zou willen is:

Ik wil dmv zoiets als huidige rij - vorige rij dus bij hoog_tarief current row - previous row daar komt dan waarde uit wat er gebeurd is in 1 minuut.

Dan kan ik bij hoog_tarief_geleverd zien wat er in die minuut geleverd is waar ik dan mooie grafiek van kan maken.
pff wil dus het verschil hebben van twee waarden uit 1 kolom.
Is het zo moeilijke vraag? of antwoord?

id laag-tarief hoog-tarief verschil
234 34521 58266 --> 118
233 34521 58147 --> 7
232 34521 58140
...
...
 
Laatst bewerkt:
Probeer dit eens:
[sql]
/**
* Create schema
CREATE TABLE verbruik (
id INT,
laag_tarief INT,
hoog_tarief INT
);

INSERT INTO verbruik VALUES
(232,34521,58140),
(233,34521,58147),
(234,34521,58266)
;
*/
SELECT
v.*,
v.hoog_tarief - IFNULL((SELECT vg.hoog_tarief FROM verbruik vg WHERE vg.id = (v.id - 1)),0) AS diff_hoog
FROM
verbruik v
ORDER BY v.id;
[/sql]
http://sqlfiddle.com/#!9/c6078/2
 
Bedankt hiervoor nu nog samenvoegen????

PHP:
<?php
 
/* Verbinding met de MySQL database maken.*/
//Connect to database
include 'config.php';
include 'opendb.php';
 
/* Uitvoeren van de query.*/ 
$sql = "SELECT id, time, laag_tarief_geleverd, hoog_tarief_geleverd, (huidig_geleverd/1000) FROM `readings`  WHERE time>= '2015-08-23 10:00:00.000000' and time <= '2015-08-23 23:00:00.000000'";

/* Het resultaat van de query in een array variabele stoppen, zodat
we deze later uit kunnen lezen.*/


$sql = "SELECT\n"
    . " v.*,\n"
    . " v.laag_tarief - IFNULL((SELECT vg.`laag_tarief` FROM readings vg WHERE vg.id = (v.id - 1)),0) AS diff_laag\n"
    . "FROM\n"
    . " readings v ORDER BY `id` DESC LIMIT 0, 60 ";

$result = mysql_query($sql);
 
/* Met behulp van de functie mysql_fetch_assoc halen we de rijen
uit de array op.*/
while ($row = mysql_fetch_assoc($result)) {
 
/* Print het resultaat uit de huidige rij op het scherm.*/


{
      echo "<table width='100%' border='7'>\n";
echo '<tr>';

$i = 1;
while($row = mysql_fetch_assoc($result)) 
{
    echo '<td>'.$row['id'].'</td><td>'
            	.$row['time'].'</td><td>'
               .$row['hoog_tarief_geleverd'].'</td><td>'
			   .$row['laag_tarief_geleverd'].'</td><td>'
			   .$row['diff_laag'].'</td><td>'
/*regel 43 */	   .$row['(huidig_geleverd/1000)'].'</td></td>'; 
			   			   
			          
    if($i % 2 == 0)
    {
        echo '</tr><tr>';
    }
    $i++;
}

echo '</tr>';
echo $sql;
echo '</table>';
}
}
?>

de \n betekend dat alle kolommen? en de v dan? en de vg? kan je me het beetje uitleggen.

Zoals ik het er nu heb staan volgt de fout melding: Notice: Undefined index: (huidig_geleverd/1000) in /public/sites/www.-------/datalogger/test3.php on line 43
 
Laatst bewerkt door een moderator:
De schrijfmethode met \n is echt pure onzin en zorgt er alleen maar voor dat het onleesbaar wordt. Dit doet namelijk hetzelfde en is (vind ik) een stuk leesbaarder:

PHP:
$sql = "
SELECT
    v.*,
    v.laag_tarief - IFNULL((SELECT vg.`laag_tarief` FROM readings vg WHERE vg.id = (v.id - 1)),0) AS diff_laag
FROM
    readings v
ORDER BY `id` DESC
LIMIT 0, 60";

\n houdt een nieuwe regel in, dat is iets voor de leesbaarheid maar in dit geval totale onzin.
v is de alias van je tabel ("FROM readings v", anders moet je overal v. vervangen door readings.)
vg is ook een alias van een tabel, zo kun je onderscheid maken tussen welke gegevens je opvraagt.

Dat je die foutmelding krijgt klopt, je vraag immers de gegevens als array op (mysql_fetch_assoc()). Dat houdt in je dat je een kolom als "key" moet aanroepen en je er dan pas mee kunt gaan rekenen.

Je zult dus regel 43 moeten wijzigen naar dit:
PHP:
. ($row['huidig_geleverd'] / 1000) .'</td></td>';
Overigens is het bijhouden van $i ook overbodig, het wordt gebruikt om een nieuwe rij aan te maken. Echter kun je dat prima in je while regelen.

Ik zie echter dat er wel meer aan schort, je declareert op regel 9 $sql maar overschrijft deze op regel 15 al weer. Daarnaast hoef je maar één keer een while uit te laten voeren, nu doe je dat twee keer.

Probeer dit eens:
PHP:
<?php
 
/* Verbinding met de MySQL database maken.*/
//Connect to database
include 'config.php';
include 'opendb.php';
 
// Query opbouwen
$sql = "
SELECT
    v.*,
    v.laag_tarief - IFNULL((SELECT vg.`laag_tarief` FROM readings vg WHERE vg.id = (v.id - 1)),0) AS diff_laag
FROM
    readings v
ORDER BY `id` DESC
LIMIT 0, 60";
 
$result = mysql_query($sql);

echo '<table width="100%" border="7">';
/* Met behulp van de functie mysql_fetch_assoc halen we de rijen
uit de array op.*/
while ($row = mysql_fetch_assoc($result)) {
    echo '
    <tr>
        <td>'.$row['id'].'</td>
        <td>'.$row['time'].'</td>
        <td>'.$row['hoog_tarief_geleverd'].'</td>
        <td>'.$row['laag_tarief_geleverd'].'</td>
        <td>'.$row['diff_laag'].'</td>
        <td>'. ($row['huidig_geleverd'] / 1000).'</td>
    </tr>';
}
echo '</table>';

Let wel op dat het gebruik van "mysql_*" functies afgeraden wordt omdat deze binnenkort uit PHP gaan verdwijnen. Gebruik daarvoor in de plaats MySQLi of PDO.
 
Laatst bewerkt:
Dank je, heel veel info voor iemand die knipt en plakt en probeert samen te voegen.
Ik ga ermee aan de slag.
 
Je komt misschien met knippen en plakken een aardig eind maar het is wel belangrijk dat je de basis begrijpt anders heb je geen idee wat je aan het doen bent en waarom je bepaalde dingen zo doet :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan