Ankündigung

Einklappen
Keine Ankündigung bisher.

Differenz rechnen anhand unterschiedlichem Datum zu einer W_ID

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

  • Differenz rechnen anhand unterschiedlichem Datum zu einer W_ID

    Hallo Leute, eine knifflige Frage.

    Meine Tabelle sieht so aus:

    ID, W_ID, DATUM, KURS.

    1 | 1 | 2018-02-06 | 10,10
    2 | 2 | 2018-02-06 | 15,50
    3 | 3 | 2018-02-06 | 20,20
    4 | 4 | 2018-02-06 | 30,00
    5 | 1 | 2018-02-07 | 10,20
    6 | 2 | 2018-02-07 | 15,60
    7 | 3 | 2018-02-07 | 20,10
    8 | 4 | 2018-02-07 | 30,10

    Die Spalte ID ist immer fortlaufend. Die Spalte w_id ist jene welche mir den Namen des Wertpapieres von einer anderen Tabelle anzeigt. Die Spalte Datum ist 4x immer gleich, da ich ja 4 Wertpapiere habe (siehe w_id) Die Spalte kurs ist immer ein anderer.

    So, nun möchte ich die differenz vom Vortag angezeigt bekommen.
    ID 1 und ID 5 haben die selbe W_ID, unterschiedliches Datum und natürlich unterschiedlichen Kurs. Daher soll das Ergebnis -0,10 sein.

    Ich komm leider nicht dahinter, wie ich dies in einer IF-Abfrage umsetzen kann.

    Bitte nochmals um hilfe
    LG, Andi


  • #2
    Die Daten kommen aus einer DB? Fast alle Datenbanken kennen Window-Funktionen, damit geht das ganz einfach. Mittels lag() over (....) kannstDu das ganz easy machen. Wenn Du willst, zeige ich Dir ein Beispiel.

    Ach ja: solltest Du MySQL haben: das kann das nicht.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Ich hab mysql. Ich würde dies gerne mit php lösen.

      Kommentar


      • #4
        Code:
        test=*# select * from mwerk ;
         id | w_id |   datum    | kurs  
        ----+------+------------+-------
          1 |    1 | 2018-02-06 | 10.10
          2 |    2 | 2018-02-06 | 15.50
          3 |    3 | 2018-02-06 | 20.20
          4 |    4 | 2018-02-06 | 30.00
          5 |    1 | 2018-02-07 | 10.20
          6 |    2 | 2018-02-07 | 15.60
          7 |    3 | 2018-02-07 | 20.10
          8 |    4 | 2018-02-07 | 30.10
        (8 Zeilen)
        
        test=*# select *, kurs - lag(kurs) over (partition by w_id order by datum) from mwerk order by w_id, datum;
         id | w_id |   datum    | kurs  | ?column?
        ----+------+------------+-------+----------
          1 |    1 | 2018-02-06 | 10.10 |         
          5 |    1 | 2018-02-07 | 10.20 |     0.10
          2 |    2 | 2018-02-06 | 15.50 |         
          6 |    2 | 2018-02-07 | 15.60 |     0.10
          3 |    3 | 2018-02-06 | 20.20 |         
          7 |    3 | 2018-02-07 | 20.10 |    -0.10
          4 |    4 | 2018-02-06 | 30.00 |         
          8 |    4 | 2018-02-07 | 30.10 |     0.10
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Zitat von m-werk Beitrag anzeigen
          Ich hab mysql. Ich würde dies gerne mit php lösen.
          Ah okay. Dann vergiß meine Antwort #4 und viel Spaß bei der Lösung mit PHP.
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            Für eine pure MySQL Lösung ist Pivot das Schlüsselwort. Beispiel siehe hier.
            Für deine geringe Anzahl von Wertpapieren ist wohl eine gemischte Lösung mit SQL + PHP Arrays einfacher. Die Papiere für den Tag und Vortag per SQL auswählen und dann in ein mehrdimensionales Array mit den Schlüsseln W_ID und Datum ablegen. Der Rest ergibt sich dann.
            jspit.de github

            Kommentar


            • #7
              Zitat von jspit Beitrag anzeigen
              Für eine pure MySQL Lösung ist Pivot das Schlüsselwort.
              Nette Idee.

              Fragesteller bitte weghören, denn Du willst das ja in PHP lösen.

              Code:
              test=*# select * from mwerk ;
               id | w_id |   datum    | kurs  
              ----+------+------------+-------
                1 |    1 | 2018-02-06 | 10.10
                2 |    2 | 2018-02-06 | 15.50
                3 |    3 | 2018-02-06 | 20.20
                4 |    4 | 2018-02-06 | 30.00
                5 |    1 | 2018-02-07 | 10.20
                6 |    2 | 2018-02-07 | 15.60
                7 |    3 | 2018-02-07 | 20.10
                8 |    4 | 2018-02-07 | 30.10
              (8 Zeilen)
              
              test=*# select w_id, b-a as "difference between 2018-02-07 and 2018-02-06" from( select w_id, sum(kurs) filter (where datum = '2018-02-06') as a, sum(kurs) filter (where datum = '2018-02-07') as b from mwerk group by w_id) foo order by w_id;
               w_id | difference between 2018-02-07 and 2018-02-06
              ------+----------------------------------------------
                  1 |                                         0.10
                  2 |                                         0.10
                  3 |                                        -0.10
                  4 |                                         0.10
              (4 Zeilen)
              
              test=*#
              Falls MySQL das FILTER nicht kann (bin mir nicht sicher): kann man umschreiben zu case ... when ...
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar


              • #8
                Bleibt anzumerken, daß die PIVOT-Lösung erheblich aufwändiger als die lag() - Lösung ist, wenn man das für N (mit N signifikat groß) Tage haben will. Also so als 'gleitende Differenz' über Wochen, Monate, Jahre, ...
                PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                Kommentar


                • #9
                  So Leute, ich komm einfach nicht dahinter. So sieht die Datenbankabfrage aus, wo auch eben alles angezeigt wird, was ich benötige.
                  PHP-Code:
                  $sql "SELECT a.id, a.w_id, b.name, a.date, a.kurs"
                          
                  " FROM kurse a"
                          
                  " INNER JOIN wertpapier b ON b.id = a.w_id"
                          
                  " ORDER BY a.date desc, b.id asc"
                          
                  " LIMIT 8";
                      
                  $stmt $db->query($sql);
                      
                  $result $stmt->fetchAll(PDO::FETCH_ASSOC); 
                  Und So sieht die Ausgabeseite aus:
                  PHP-Code:
                  <?php
                  foreach($result as $kurs) {

                      
                  $kurs_test = array();

                      if (
                  $kurs['w_id'] == 1) {

                              
                  $kurs_test[] = $kurs['kurs'];
                              
                  print_r($kurs_test);
                      }
                  }
                  Das Ergebnis wird zwar richtig angezeigt, aber dass array wird nicht hochgezählt, so dass ich Array[0] und Array[1] habe.
                  Array ( [0] => 15,92 ) Array ( [0] => 15,96 )

                  Kann mir hir bitte jemand helfen?

                  Kommentar


                  • #10
                    Warum erstellst du dir nicht ein neues Array mit einer Struktur welche sich gut weiterverarbeiten lässt?
                    Mal als Beispiel:
                    PHP-Code:
                    $arr = [];
                    foreach(
                    $result as $row){
                      
                    $arr[$row['w_id']][$row['datum']] = $row['kurs'];
                    }

                    //Testausgabe
                    debug::write($arr); 
                    Testausgabe:
                    PHP-Code:
                    array (
                      
                    => 
                      array (
                        
                    '2018-02-06' => 10.1,
                        
                    '2018-02-07' => 10.2,
                      ),
                      
                    => 
                      array (
                        
                    '2018-02-06' => 15.5,
                        
                    '2018-02-07' => 15.6,
                      ),
                      
                    => 
                      array (
                        
                    '2018-02-06' => 20.2,
                        
                    '2018-02-07' => 20.1,
                      ),
                      
                    => 
                      array (
                        
                    '2018-02-06' => 30.0,
                        
                    '2018-02-07' => 30.1,
                      ),

                    jspit.de github

                    Kommentar


                    • #11
                      Hallo, ich hab nun einen etwas anderen Lösungsansatz gefunden, hab aber ein Problem, mein Array zusätzich in die Foreach-Schleife einzubauen.

                      So hab ich jetzt mal die Frontendausgabe:
                      PHP-Code:
                      {? foreach($result as $kurs => $val) { ?}

                          <
                      tr>
                              <
                      td>{. datetime('date'$val['date']) .}</td>
                              <
                      td>{. $val['name'] .}</td>
                              <
                      td>{. $val['kurs'] .}</td>
                              <
                      td><input class="btn_submit" type="submit" name="action[{. $val['id'] .}]" value="Bearbeiten" /></td>
                              <
                      td>Hier soll das Ergebnis hinein</td>
                              <
                      input type="hidden" name="id" value="{. $val['id'] .}" />    
                          </
                      tr>

                      {?  }

                      echo 
                      '<pre>';
                          
                      print_r($ergebnis);
                      echo 
                      '</pre>';

                      ?} 
                      Im Frontend wird die Tabelle richtig angezeigt. Das Array Ergebnis ist extra und sieht so aus:
                      Array ( [1] => -0,04 [2] => -0,09 [3] => -0,17 [4] => -0,51 ) Der Key wäre hier der gleiche wie der $val['w_id'] von der foreach-Schleife. Wenn ich in der Foreach noch eine Foreach einbaue, dann wird die Tabelle größer, da sich die Daten jedesmal um's 4fache angezeigt werden. Ich schaff es leider nicht, dass ich das $ergebnis-Array zusätzich in die Foreach-Schleife ander richtigen Stelle einbaue.

                      Kommentar


                      • #12
                        Ach ja, so sieht meine gesamte Abfrage aus:
                        PHP-Code:
                        $tpl = new Template(TEMPLATE.'uebersicht_kurse.html5');
                        $table "kurse";

                        //Abfrage der Daten
                        $sql "SELECT a.id, a.w_id, b.name, a.date, a.kurs"
                            
                        " FROM kurse a"
                            
                        " INNER JOIN wertpapier b ON b.id = a.w_id"
                            
                        " ORDER BY a.date desc, b.id asc"
                            
                        " LIMIT 8";
                        $stmt $db->query($sql);
                        $result $stmt->fetchAll(PDO::FETCH_ASSOC);

                        foreach (
                        $result as $key => $value){

                            
                        $kurs str_replace(',''.'$value['kurs']);

                            if (
                        $key == 0) {
                                
                        $key_kons_neu $kurs;    
                            }
                            if (
                        $key == 4) {
                                
                        $key_kons_alt $kurs;
                            }    
                            if (
                        $key == 1) {
                                
                        $key_ma_neu $kurs;
                            }
                            if (
                        $key == 5) {
                                
                        $key_ma_alt $kurs;
                            }
                            if (
                        $key == 2) {
                                
                        $key_wachst_neu $kurs;
                            }
                            if (
                        $key == 6) {
                                
                        $key_wachst_alt $kurs;
                            }
                            if (
                        $key == 3) {
                                
                        $key_alter_neu $kurs;
                            }
                            if (
                        $key == 7) {
                                
                        $key_alter_alt $kurs;
                            }
                        }

                        $ergebnis_kons number_format($key_kons_neu-$key_kons_alt2',''.');
                        $ergebnis_ma number_format($key_ma_neu-$key_ma_alt2',''.');
                        $ergebnis_wachst number_format($key_wachst_neu-$key_wachst_alt2',''.');    
                        $ergebnis_alter number_format($key_alter_neu-$key_alter_alt2',''.');    

                        $ergebnis_kons_proz number_format((($key_kons_neu/$key_kons_alt)*100)-1002',''.');
                        $ergebnis_ma_proz number_format((($key_ma_neu/$key_ma_alt)*100)-1002',''.');
                        $ergebnis_wachst_proz number_format((($key_wachst_neu/$key_wachst_alt)*100)-1002',''.');
                        $ergebnis_alter_proz number_format((($key_alter_neu/$key_alter_alt)*100)-1002',''.');

                        $arr_erg = array(array(=> $ergebnis_kons,
                                        
                        => $ergebnis_ma,
                                        
                        => $ergebnis_wachst,
                                        
                        => $ergebnis_alter));

                        $arr_erg_proz = array(array(=> $ergebnis_kons_proz,
                                        
                        => $ergebnis_ma_proz,
                                        
                        => $ergebnis_wachst_proz,
                                        
                        => $ergebnis_alter_proz));                

                        //Übertabe der Daten     
                        $tpl->array_setvar(
                            Array(
                                
                        'result' => $result,
                                
                        'table'     => $table,
                                
                        'ergebnis' => $arr_erg,
                                
                        'ergebnis_proz' => $arr_erg_proz
                            
                        )
                        );
                        echo 
                        $tpl->output(); 

                        Kommentar

                        Lädt...
                        X