2017-12-31 75 views
1

Chart.jsを使用してグラフを作成しています。私はいくつかの日付と売上高をデータベースに保存しています。ここで私はAJAXリクエストを使用してDBからレコードを選ぶと、二つの異なる配列date["2017-12-18","2017-12-20","2017-12-26"]amt["2000","3000","6000"]にデータを分割して、そのデータを使って棒グラフを作成しています:ここでデータベースにない日付の売上を自動的に表示

$(document).ready(function(){ 
    $.post("ajax-req-handler.php", 
    { 
     key: "draw-line-chart" 
    }, 
    function(data){ 
     console.log(data); 
     data = JSON.parse(data); 
     var date = []; 
     var amt = []; 
     for(var i in data){  
      date.push(data[i].sale_date); 
      amt.push(data[i].total); 
     } 
     console.log(date); 
     console.log(amt); 
     var ctx = document.getElementById("myChart").getContext('2d'); 
     var myChart = new Chart(ctx, { 
      type: 'bar', 
      data: { 
       labels: date, 
       datasets: [{ 
        label: '', 
        data: amt, 
        backgroundColor: [ 
         'rgba(255, 99, 132, 0.2)', 
         'rgba(54, 162, 235, 0.2)', 
         'rgba(255, 206, 86, 0.2)', 
         'rgba(75, 192, 192, 0.2)', 
         'rgba(153, 102, 255, 0.2)', 
         'rgba(255, 159, 64, 0.2)' 
        ], 
        borderColor: [ 
         'rgba(255,99,132,1)', 
         'rgba(54, 162, 235, 1)', 
         'rgba(255, 206, 86, 1)', 
         'rgba(75, 192, 192, 1)', 
         'rgba(153, 102, 255, 1)', 
         'rgba(255, 159, 64, 1)' 
        ], 
        borderWidth: 1 
       }] 
      }, 
      options: { 
       scales: { 
        yAxes: [{ 
         ticks: { 
          beginAtZero:true 
         } 
        }] 
       } 
      } 
     }); 
    }); 
}); 

は私ajax-req-handler.php

$sql = "SELECT DATE(sale_date) AS sale_date, SUM(total) AS total FROM customers GROUP BY DATE(sale_date)"; 
     $result = $conn->query($sql); 
     $db_data = array(); 
     while ($row = $result->fetch_assoc()) { 
      $db_data[] = $row; 
     } 
     echo json_encode($db_data); 
です

永遠にisworkingされていますが、私が欲しいのは、0の値で売ることなく日付を表示することです。 26へ18 20から20の間の日付が値0

+0

はちょうどあなたのアプリケーションコードで行方不明日付のロジックを処理します – Strawberry

答えて

2

を持つべきであるあなたはCOALESCE

$sql = "SELECT DATE(sale_date) AS sale_date, COALESCE(SUM(total),0) AS total FROM customers GROUP BY DATE(sale_date)"; 

を使用する必要があり、あなたが存在しないも、これらの日付をしたいので、あなたは(PHPのコードを変更する必要がありますテーブルしかし、これらの日付の間に、あなたが実際に)テーブルから得た来た: -

$db_data = array(); //change from this line onward 
while ($row = $result->fetch_assoc()) { 
    $db_data[$row['sale_date']] = $row; 
} 
$date_array = array_keys($db_data); 

$begin = new DateTime($date_array[0]); 
$end = new DateTime(end($date_array)); 

$daterange = new DatePeriod($begin, new DateInterval('P1D'), $end); 

$actual_array = []; 
foreach($daterange as $date){ 
    if(isset($db_data[$date->format("Y-m-d")])){ 
     $actual_array[] = ['sale_date'=>$date->format("Y-m-d"),'total'=>$db_data[$date->format("Y-m-d")]['total']]; 
    }else{ 
     $actual_array[] = ['sale_date'=>$date->format("Y-m-d"),'total'=>0]; 
    } 
} 
if(isset($db_data[$end->format("Y-m-d")])){ 
    $actual_array[] = ['sale_date'=>$end->format("Y-m-d"),'total'=>$db_data[$end->format("Y-m-d")]['total']]; 
}else{ 
    $actual_array[] = ['sale_date'=>$end->format("Y-m-d"),'total'=>0]; 
} 
echo json_encode($actual_array); 
関連する問題