2016-08-19 9 views
2

私は、MySQL、PHP、Fusion Chartsを使用して折れ線グラフを作成し、2016年に毎月請求された金額を追跡します。 InvoiceAmount(Decimal型)とInvoiceDate(DateTime型)です。JSONの値を月単位で合計してFusion Chartsグラフ

私の目標は、グラフのX軸をInvoiceDateからの月(Jan、Feb、Marなど)の日付とし、Y軸をInvoiceAmountからの金額とすることです。私は、それが融合チャートで読めるようにするためにJSON形式に私のMySQLのデータを変換することによって始まった:あなたのよう

[ 
{ 
    "label": "January", 
    "value": "11361.00" 
}, 
{ 
    "label": "December", 
    "value": "1164.40" 
}, 
{ 
    "label": "February", 
    "value": "166.80" 
}, 
{ 
    "label": "July", 
    "value": "5088.00" 
}, 
{ 
    "label": "January", 
    "value": "214.50" 
}, 
{ 
    "label": "June", 
    "value": "620.40" 
}, 
{ 
    "label": "July", 
    "value": "5250.00" 
}, 
{ 
    "label": "March", 
    "value": "3425.00" 
}, 
{ 
    "label": "January", 
    "value": "3790.00" 
}, 
{ 
    "label": "February", 
    "value": "1909.80" 
}, 
{ 
    "label": "January", 
    "value": "1780.00" 
}, 
{ 
    "label": "January", 
    "value": "3060.00" 
}, 
{ 
    "label": "January", 
    "value": "2680.00" 
}, 
{ 
    "label": "February", 
    "value": "604.80" 
} 
] 

など

//the SQL query to be executed 
$query = "SELECT DATE_FORMAT(InvoiceDate, '%M') AS InvoiceMonth, InvoiceAmount FROM Estimates WHERE InvoiceDate IS NOT NULL AND YEAR(InvoiceDate) = 2016 AND InvoiceAmount IS NOT NULL AND InvoiceAmount > 0"; 

//storing the result of the executed query 
$result = $conn->query($query); 

//initialize the array to store the processed data 
$jsonArray = array(); 

//check if there is any data returned by the SQL Query 
if ($result->num_rows > 0) { 
//Converting the results into an associative array 
while($row = $result->fetch_assoc()) { 
    $jsonArrayItem = array(); 
    $jsonArrayItem['label'] = $row['InvoiceMonth']; 
    $jsonArrayItem['value'] = $row['InvoiceAmount']; 
    //append the above created object into the main array. 
    array_push($jsonArray, $jsonArrayItem); 
    } 
} 

//Closing the connection to DB 
$conn->close(); 

//set the response content type as JSON 
header('Content-type: application/json'); 
//output the return value of json encode using the echo function. 
echo json_encode($jsonArray, JSON_PRETTY_PRINT); 

これは、このようにJSONを出力します同じ月が付いているいくつかの値があります。現在、1月、2月、3月などの全体的な月次値を作成するために、特定の月の値すべてを一緒に追加する必要がある場合、折れ線グラフはこれらのラベル/値の各ペアを1つの別個のインスタンスとして扱います。 。

Example of line graph as it is currently.

は値に取り付けられた月をチェックして、一緒に同じ月からすべての値を追加します、私はPHPやMySQLで使用できる機能はありますか?この問題に取り組む最善の方法を教えてください。ご協力ありがとうございました。

答えて

4

あなたは、SQL文が唯一の月ごとに1つのレコードを返すようにするGROUP BYSUMを使用することができます。

SELECT DATE_FORMAT(InvoiceDate, '%M') AS InvoiceMonth, 
     SUM(InvoiceAmount) AS InvoiceAmount 
FROM  Estimates 
WHERE InvoiceDate IS NOT NULL 
    AND YEAR(InvoiceDate) = 2016 
    AND InvoiceAmount IS NOT NULL 
    AND InvoiceAmount > 0 
GROUP BY DATE_FORMAT(InvoiceDate, '%M') 

がハードコーディングされた年でクエリが長期的に維持可能ではないことに注意してください。

私は最後の12ヶ月を示すことをお勧め。最後の列には201508のような「年月」が表示されます。結果は次のようになります。

SELECT DATE_FORMAT(InvoiceDate, '%M') AS InvoiceMonth, 
     SUM(InvoiceAmount) AS InvoiceAmount, 
     EXTRACT(YEAR_MONTH FROM InvoiceDate) As InvoiceYearMonth 
FROM  Estimates 
WHERE InvoiceDate IS NOT NULL 
    AND EXTRACT(YEAR_MONTH FROM InvoiceDate) >= EXTRACT(YEAR_MONTH FROM CURDATE())-100 
    AND InvoiceAmount IS NOT NULL 
    AND InvoiceAmount > 0 
GROUP BY DATE_FORMAT(InvoiceDate, '%M') 
ORDER BY InvoiceYearMonth 
+0

これは完璧に機能しました。ありがとうございました!クエリのこの部分は:YEAR(InvoiceDate)= 2016'は2016年の値を取得するだけでは機能しませんか? @trincot – Liz

+1

はい、そうですが、毎年それを変更しようとしていますか?また、2017年の早い時期に2017年にコードを変更した場合は、2017月のみを取得することができます。これは1月だけかもしれませんか?最新の12か月を表示することは興味深い選択肢でしょうか? – trincot

+0

これは非常に真実であり、長期的には持続可能ではありません。あなたは別の勧告をしていますか? – Liz

関連する問題