Суммируйте значения из JSON по месяцам для графика Fusion Charts

Я использую MySQL, PHP и Fusion Charts создать линейный график для отслеживания суммы денег, выставляемой за каждый месяц в 2016 году. Два столбца в моей таблице, которые я использую для этого графика, — это InvoiceAmount (тип Decimal) и InvoiceDate (тип DateTime).

Моя цель состоит в том, чтобы ось X моего графика была датами по месяцам (январь, февраль, мар и т. Д.) Из InvoiceDate, а ось Y — суммой в долларах из InvoiceAmount. Я начал с преобразования моих данных MySQL в формат JSON, чтобы их можно было прочитать с помощью Fusion Charts:

//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 так:

[
{
"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"}
]

и т.п.

Как видите, есть несколько значений, к которым привязан один и тот же месяц. В настоящее время линейный график рассматривает каждую из этих пар метка / значение как один отдельный случай, когда мне нужно, чтобы все значения определенного месяца были сложены вместе, чтобы получить общее месячное значение для января, февраля, марта и т. Д. ,

Пример линейного графика, как сейчас.

Есть ли функция, которую я могу использовать в PHP или MySQL, которая проверит, какой месяц связан со значением, а затем сложит все значения за один месяц вместе? Пожалуйста, дайте мне знать лучший способ решения этой проблемы. Спасибо за помощь.

2

Решение

Вы могли бы использовать GROUP BY а также SUM чтобы оператор SQL возвращал только одну запись в месяц:

SELECT   DATE_FORMAT(InvoiceDate, '%M') AS InvoiceMonth,
SUM(InvoiceAmount) AS InvoiceAmount
FROM     Estimates
WHERE    YEAR(InvoiceDate) = 2016
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    EXTRACT(YEAR_MONTH FROM InvoiceDate) >= EXTRACT(YEAR_MONTH FROM CURDATE())-100
AND InvoiceAmount > 0
GROUP BY DATE_FORMAT(InvoiceDate, '%M')
ORDER BY InvoiceYearMonth
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]