Differenz berechnen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Differenz berechnen

    Hallo,


    Ich suche einen Denkansatz/Lösungsansatz für folgendes Problem.

    Ich habe eine Tabelle, Aufbau: id, userid, monat, jahr, inhalt
    In dieser wird jeden Monat ein rein nummerischer Wert gespeichert.
    Bsp. für solche Datensätze:
    1, 3, 01, 2008, 123456
    2, 3, 02, 2008, 123987
    3, 5, 02, 2008, 98321
    4, 5, 03, 2008, 98543
    5, 3, 03, 2008, 124983
    ..

    Nun möchte ich, jeweils auf ein Jahr reduziert, sämtliche Inhalte mit der userid 3 (3 als Bsp.) auslesen und die jeweilige Differenz zum vorhergehenden berechnen. Dh. dass ich im Endeffekt zB. folgendes erhalten würde

    Userid, Monat, Jahr, Inhalt, Differenz
    3, 01, 2008, 123456, -
    3, 02, 2008, 123987, 531
    3, 03, 2008, 124983, 996


    Nach meinen Überlegungen bzw. Kenntnissen gäbe es nun 2 Möglichkeiten. Die eine ist mir bei der hohen Anzahl von Datensätzen zu viel Aufwand und bei der anderen weiss ich nicht ob es überhaupt möglich ist.
    1. Die jeweilige Differenz direkt in eine Spalte der Zeile schreiben (würde bedeuten das ich die alle von Hand ausrechnen und nachtragen müsste)
    2. Wenn das überhaupt möglich ist, 2 row's miteinander verbinden.
    Also zb. $januar = $row['monat']$row['Inhalt']
    Sprich; 2 Bedingungen an eine Variable knüpfen.


    Kann sein das ich mich teilweise falsch ausdrücke, aber ich hoffe, man versteht mein Anliegen dennoch.


    Gruss & Danke. :-)

  • #2
    - group by
    - aggregatfunktionen

    2. Wenn das überhaupt möglich ist, 2 row's miteinander verbinden.
    Also zb. $januar = $row['monat']$row['Inhalt']
    Sprich; 2 Bedingungen an eine Variable knüpfen.
    1. du willst keine 'rows' sondern spalten verbinden
    2. wie willst du bedingungen an eine variable binden?
    3. man kann strings mit dem String-Konkatenator verbinden
    4. probiers doch einfach aus...
    Zuletzt geändert von BugBite; 27.06.2008, 03:42.

    Kommentar


    • #3
      Du kannst nur die Daten sortieren und an PHP geben, dann kannst du in PHP rechnen ... oder wenn du leistungsfähige DBMS hast, kannst stored procedure schreiben und darin per cursor durchlaufen, berechnen, zusammen bauen und ausgeben. Denn Daten zwischen den Zeilen zu berechnen ist sonst nicht drin.

      Kommentar


      • #4
        Hallo,



        Nachdem ich gestern noch wild rumversucht habe kam mir auch noch folgende, irgendwie total idiotische, Idee. Komisch ist daran, dass sie zwar ansatzweise das richtig liefert aber nicht wie gewünscht ausgibt. *g*

        Nicht schlagen, schaut sehr schlampig aus

        PHP-Code:
        <?php
                $id 
        $_POST["nick"];
                
        $jahr $_POST["jahr"];
                
        $min = array();
                
        $mon = array();
                
        $sql "SELECT monat, jahr, minuten FROM XY WHERE user = '$id' AND jahr = '$jahr';";
                
        $result mysql_query($sql) or die(mysql_error());
                while (
        $row mysql_fetch_array($result)) {
                
        $min[] = $row["minuten"];
                
        $mon[] = $row["monat"];
                }


                
        $eins $min[0];
                
        $zwei $min[1];
                
        $drei $min[2];
                
        $vier $min[3];
                
        $funf $min[4];
                $************ = 
        $min[5];
                
        $sieben $min[6];
                
        $acht $min[7];
                
        $neun $min[8];
                
        $zehn $min[9];
                
        $elf $min[10];
                
        $zwolf $min[11];
                
                
                
        $re_21 $zwei-$eins;
                
        $re_32 $drei-$zwei;
                
        $re_43 $vier-$drei;
                
        $re_54 $funf-$vier;
                
        $re_65 = $************-$funf;
                
        $re_76 $sieben-$************;
                
        $re_87 $acht-$sieben;
                
        $re_98 $neun-$acht;
                
        $re_109 $zehn-$neun;
                
        $re_1110 $elf-$zehn;
                
        $re_1211 $zwolf-$elf;

                
        ?>
                <table style="width:40%" border=\"1\"><tr>
                 <th class="P" style="vertical-align:top">Monat</th>
                 <th class="Q" style="vertical-align:top">Jahr</th>
                 <th class="P" style="vertical-align:top">Minutenstand</th>
                 <th class="Q" style="vertical-align:top">Online</th>
                </tr><tr>
                <?php 
                $sql 
        "SELECT monat, jahr, minuten FROM XY WHERE user = '$id' AND jahr = '$jahr';";
                
        $result mysql_query($sql) or die(mysql_error());
                while (
        $row mysql_fetch_array($result)) {
                    
        ?>
                <td class="P" style="text-align:right"><b><?php 
                
        if ($row['monat'] == "01") { echo "Januar"; }
                if (
        $row['monat'] == "02") { echo "Februar"; }
                if (
        $row['monat'] == "03") { echo "März"; }
                if (
        $row['monat'] == "04") { echo "April"; }
                if (
        $row['monat'] == "05") { echo "Mai"; }
                if (
        $row['monat'] == "06") { echo "Juni"; }
                if (
        $row['monat'] == "07") { echo "Juli"; }
                if (
        $row['monat'] == "08") { echo "August"; }
                if (
        $row['monat'] == "09") { echo "September"; }
                if (
        $row['monat'] == "10") { echo "Oktober"; }
                if (
        $row['monat'] == "11") { echo "November"; }
                if (
        $row['monat'] == "12") { echo "Dezember"; }
                echo 
        "</td>";
                echo 
        "<td class=\"Q\" style=\"text-align:right\">";
                echo 
        "".$row["jahr"]."</td>";
                echo 
        "<td class=\"P\" style=\"text-align:right\">";
                echo 
        "".$row["minuten"]."</td>";
                echo 
        "<td class=\"Q\" style=\"text-align:right\">";

                echo 
        $re_21";
                if (
        $re_32 != "") {
                    echo 
        $re_32"; }  
                if (
        $re_43 != "") {
                    echo 
        $re_43"; }  
                if (
        $re_54 != "") {
                    echo 
        $re_54"; }  
                if (
        $re_65 != "") {
                    echo 
        $re_65"; }  
                if (
        $re_76 != "") {
                    echo 
        $re_76"; }  
                if (
        $re_87 != "") {
                    echo 
        $re_87"; }  
                if (
        $re_98 != "") {
                    echo 
        $re_98"; }  
                if (
        $re_109 != "") {
                    echo 
        $re_109"; }  
                if (
        $re_1110 != "") {
                    echo 
        $re_1110"; }  
                if (
        $re_1211 != "") {
                    echo 
        $re_1211"; }
                echo 
        "</td></tr>";
                }
            echo 
        "</table>";
        Ergebniss ist dann:

        Monat Jahr Minutenstand Online
        Januar 2008 237195 5673 4844 6179 2914 3312 -260117
        Februar 2008 242868 5673 4844 6179 2914 3312 -260117
        März 2008 247712 5673 4844 6179 2914 3312 -260117
        April 2008 253891 5673 4844 6179 2914 3312 -260117
        Mai 2008 256805 5673 4844 6179 2914 3312 -260117
        Juni 2008 260117 5673 4844 6179 2914 3312 -260117


        Die Rechnung funktioniert also, nur dass das Ergebniss mehr als einmal ausgegeben wird. *g* Es müsste so aussehen:

        Monat Jahr Minutenstand Online
        Januar 2008 237195
        Februar 2008 242868 5673
        März 2008 247712 4844
        April 2008 253891 6179
        Mai 2008 256805 2914
        Juni 2008 260117 3312

        Kommentar


        • #5
          Ehrlich gesagt, ich habe mir deinen Code nicht angeschaut. Aber ich bin mir sicher, dass er viel zu lang und zu kompliziert ist, für so ein eher einfaches Gruppenbruchproblem. Hier eine kleine Skizze, Formatierungen etc. kannst du selber dazugeben:
          PHP-Code:
          $sql "
               SELECT 
                   monat, 
                   jahr, 
                   minuten 
               FROM 
                   xy 
               WHERE 
                   user = 
          $id 
               AND 
                   jahr = 
          $jahr";
           
          $result mysql_query($sql) or die(mysql_error());
           
          $monate = array(''"Januar""Februar""März""April""Mai""Juni",  "Juli",
                              
          "August""September""Oktober",  "November""Dezember");
           
          $vmon 0;
           echo 
          "<table style='width:40%' border='1'><tr>
                  <th class='P' style='vertical-align:top'>Monat</th>
                  <th class='Q' style='vertical-align:top'>Jahr</th>
                  <th class='P' style='vertical-align:top'>Minutenstand</th>
                  <th class='Q' style='vertical-align:top'>Online</th>
                  </tr>\n"
          ;
           while (
          $row mysql_fetch_assoc($result)) {
               
          $diff = ($vmon == 0) ? '&nbsp' $row['minuten'] - $vmon;
               echo 
          "<tr><td>" $monate[$row['monat']] . "</td>
                       <td>" 
          $row['jahr'] . "</td>
                       <td>" 
          $row['minuten'] . "</td>
                       <td>
          $diff</td>
                       </tr>"
          ;
               
          $vmon $row['minuten'];
           }
           echo 
          "</table>"
          Gruss
          H2O

          Kommentar


          • #6
            Mit ein paar kleinen Anpassungen funktioniert das wundertoll. *g* Danke!


            Aber.., wie schaut das nun aus, wenn ich nun nicht nur einen User sondern alle User mit den letzten (sagen wir mal) 5 Monaten haben will?

            Kommentar


            • #7
              Was verwendest du den aktuell?

              Kommentar


              • #8
                PHP-Code:
                <?php
                $sql 
                "
                     SELECT 
                         monat, 
                         jahr, 
                         minuten 
                     FROM 
                         minuts 
                     WHERE 
                         user = 
                $id 
                     AND 
                         jahr = 
                $jahr ORDER BY monat";
                 
                $result mysql_query($sql) or die(mysql_error());
                 
                $monate = array(''"Januar""Februar""März""April""Mai""Juni",  "Juli",
                                    
                "August""September""Oktober",  "November""Dezember");
                 
                $vmon 0;
                 echo 
                "<table style='width:40%' border='1'><tr>
                        <th class='P' style='vertical-align:top'>Monat</th>
                        <th class='Q' style='vertical-align:top'>Jahr</th>
                        <th class='P' style='vertical-align:top'>Minutenstand</th>
                        <th class='Q' style='vertical-align:top'>Online</th>
                        </tr><tr>\n"
                ;
                 while (
                $row mysql_fetch_assoc($result)) {
                     
                $diff = ($vmon == 0) ? '&nbsp' $row['minuten'] - $vmon;
                //     echo "<tr><td>" . $monate[$row['monat']] . "</td>";

                    
                ?><td class="P" style="text-align:right"><b><?php 
                        
                if ($row['monat'] == "01") { echo "Januar"; }
                        if (
                $row['monat'] == "02") { echo "Februar"; }
                        if (
                $row['monat'] == "03") { echo "März"; }
                        if (
                $row['monat'] == "04") { echo "April"; }
                        if (
                $row['monat'] == "05") { echo "Mai"; }
                        if (
                $row['monat'] == "06") { echo "Juni"; }
                        if (
                $row['monat'] == "07") { echo "Juli"; }
                        if (
                $row['monat'] == "08") { echo "August"; }
                        if (
                $row['monat'] == "09") { echo "September"; }
                        if (
                $row['monat'] == "10") { echo "Oktober"; }
                        if (
                $row['monat'] == "11") { echo "November"; }
                        if (
                $row['monat'] == "12") { echo "Dezember"; }
                        echo 
                "</td>";

                       echo 
                "<td>" $row['jahr'] . "</td>
                             <td>" 
                $row['minuten'] . "</td>
                             <td>
                $diff</td>
                             </tr>"
                ;
                     
                $vmon $row['minuten'];
                 }
                 echo 
                "</table>";
                Hab das Monats-Array mal rausgenommen weil es noch zu kleineren Anzeigefehlern kam, aber das eigentlich gewollte funktioniert - kleinigkeiten mach' ich erst später. *g*

                Aus o.g. wird ja jeweils nur ein User bzw. seine Informationen aufgerufen. Nun sollte es für die Gesamtansicht so sein, dass automatisch vom aktuellen Monat, 5 Monate zurück gerechnet wird
                zB. mit
                PHP-Code:
                $akt date("m");
                $raum $akt 5
                Dann sollen diese 5 Monate, zu jedem User ausgelesen und jeweils auch die Differenz berechnet werden. Sodass man am Ende eine Tabelle hat die in etwa so ausschaut:

                User1, Monat1*, Diff, Monat2*, Diff, Monat3*, Diff, Monat4*, Diff, Monat5*, Diff
                User2, Monat1*, Diff, Monat2*, Diff, Monat3*, Diff, Monat4*, Diff, Monat5*, Diff
                usw.
                (* sollte dann der ausgelesene Monatsstand sein)
                Als Tabellenheader natürlich auch die Monatsnamen, wenn das überhaupt möglich ist.

                Kommentar


                • #9
                  Bin nicht so ganz auf der Höhe, was dein eigentliches vorhaben ist, aber mit ziemlicher Sicherheit kann ich dir sagen, dass ein "WHERE user = $id" dabei nichts zu suchen hat, wenn du alle User anzeigen willst.

                  Woran scheitert es denn, nachdem du das where entfernt hast?

                  Kommentar


                  • #10
                    Ach.., ich dachte Du willst wissen was ich bisher nutzte, also die obige Frage.. Nun war's aber schon wieder eine neue Frage, daher die Verwirrung.

                    Du hast mit Deiner Annahme natürlich richtig, das snippet aus dem letzten Posting ist nur für einen einzelnen User gedacht, nun gehts aber noch darum, für alle User etwas zur Ansicht zu haben.

                    Die Abfrage dafür hätte ich schon bereit, scheint mir nach phpma auch richtig zu sein - nur die Verarbeitung bereitet mir Probleme.

                    Abfragen würde ich dabei so:

                    PHP-Code:
                    $akt date("m");
                    $fnull 0;
                    $raum $akt 5
                    echo 
                    "$raum";
                    if (
                    $akt <= 9) {
                        
                    $raum2 $fnull."".$raum;
                    } else {
                        
                    $raum2 $raum;
                        }
                    $sql "SELECT user, monat, jahr, minuten 
                    FROM minuts 
                    WHERE jahr = '2008' AND monat BETWEEN 
                    $raum2 AND $akt 
                    ORDER BY user, monat"

                    Die If-Anweisung weil bei einem -5 die führende 0 gekillt wird die ich aber weiterhin brauch (oder kann man sowas verhindern?)

                    Kommentar


                    • #11
                      Die If-Anweisung weil bei einem -5 die führende 0 gekillt wird die ich aber weiterhin brauch (oder kann man sowas verhindern?)
                      Wüsste nicht, wofür man eine führende 0 braucht. Das sollten INTEGER sein!!!

                      Aber davon mal abgesehen. Woran scheiterst du nun?

                      Kommentar


                      • #12
                        Die Monatsangaben werden mit einer führenden 0 gespeichert (januar = 01, Februar = 02, etc.)

                        Problem ist, dass die 'Rechnung' nur einmal pro Durchgang gemacht wird, sie sollte aber 5 mal gemacht werden *denk*

                        Drum schauts jetzt so aus:
                        Code:
                        UserId Jahr Monat Online Monat Online Monat Online Monat Online Monat Online 
                        3 2008 Januar   Januar   Januar   Januar   Januar   
                        3 2008 Februar 1809 Februar 1809 Februar 1809 Februar 1809 Februar 1809 
                        3 2008 März 797 März 797 März 797 März 797 März 797 
                        3 2008 April 2022 April 2022 April 2022 April 2022 April 2022 
                        3 2008 Mai 1549 Mai 1549 Mai 1549 Mai 1549 Mai 1549 
                        3 2008 Juni 1426 Juni 1426 Juni 1426 Juni 1426 Juni 1426
                        Das müsste aber alles in einer Zeile stehen, also pro User eine Zeile...

                        Kommentar


                        • #13
                          Die Monatsangaben werden mit einer führenden 0 gespeichert (januar = 01, Februar = 02, etc.)
                          Da hätte man besser vorher drüber nachgedacht. Dazu gibt es nämlich keinen Grund. Übrigens hat SQL auch schöne Datumstypen wie z.B. DATE. Also wenn es noch möglich ist, solltest du rechtzeitig dein DB-Layout überdenken.

                          Problem ist, dass die 'Rechnung' nur einmal pro Durchgang gemacht wird, sie sollte aber 5 mal gemacht werden *denk*
                          Meinst du die Rechnung die VOR der Query gemacht wird?

                          Kommentar


                          • #14
                            Nein, die Rechnung die danach gemacht wird. Die Rechnung aus dem Code für einen einzelnen User bleibt ansich ja die selbe nur müsste sie mehr als einmal durchgegangen werden.

                            Also die da:
                            PHP-Code:
                            $diff = ($vmon == 0) ? '&nbsp' $row['minuten'] - $vmon

                            Bei etwas über 1200 Datensätzen dürfte es für's andern des Formats wohl schon zu spät sein. *g*

                            Kommentar


                            • #15
                              Also die da:
                              Lass dir doch nicht alles aus der nase ziehen. Wird die in ner entsprechenden Schleife ausgeführt? Warum wird sie nur einmal ausgeführt, usw? Beschreib dein konkretes Problem, oder bin ich heute nur so schwer von Begriff?

                              Bei etwas über 1200 Datensätzen dürfte es für's andern des Formats wohl schon zu spät sein. *g*
                              Die bloße Existenz von Datensätze ist da mit Sicherheit kein Grund. Nicht bei einem so simplen update...

                              Kommentar

                              Lädt...
                              X