ямочки — нанесение сумм в виде столбиков в течение 52 недель

#mysql #plot #bar-chart #dimple.js

Вопрос:

Я пытаюсь построить сложенные суммы с помощью dimple для каждой недели в году.

  • На оси x должны отображаться номера недель, от 1 до 52.
  • По оси y отображаются сложенные суммы,поступающие из 3 таблиц,которые мы хотим отобразить в виде категорий A, B, C.

Верхний график-это почти то, чего я хочу достичь, но отсутствуют недели, для которых нет сумм (например, недели № 22 и 24), и все недели с № 28 по № 52.

суммы ямочек из категорий, построенных по номеру недели

Я добавил таблицу «недели», в которой перечислены все недели с 1 по 52. Внешнее соединение выполняется для номера недели, чтобы отформатировать ось x, как видно на втором графике.

PHP — код, который извлекает данные для верхней диаграммы, выглядит следующим образом:

     function utf8ize($d) {
    if (is_array($d)) 
        foreach ($d as $k => $v) 
            $d[$k] = utf8ize($v);
     else 
        return utf8_encode($d);

    return $d;
}

$sql="SELECT s.num_week, category, amount_to_plot FROM weeks RIGHT OUTER JOIN
((SELECT WEEK(date,3) AS week,'A' AS category,SUM(amount) AS amount_to_plot FROM amounts_A GROUP BY WEEK(date,3))
UNION (SELECT WEEK(date,3) AS week,'B' AS category,SUM(amount) AS amount_to_plot FROM amounts_B GROUP BY WEEK(date,3))
UNION (SELECT WEEK(date,3) AS week,'C' AS category,SUM(amount) AS amount_to_plot FROM amounts_C GROUP BY WEEK(date,3)) 
 ) r
ON s.num_week = r.week WHERE s.num_week!=53 ORDER BY s.date_debut ASC
";

$result = mysqli_query($connection, $sql) or die("Error in Selecting " . mysqli_error($connection));

$amounts = array();
while($row =mysqli_fetch_assoc($result))
  {
    $amounts[] = $row;
  }
$data = json_encode(utf8ize($amounts),JSON_UNESCAPED_UNICODE);
echo $data;
 

В приведенном выше коде, заменив «ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ» на «ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ», также генерируются записи json за пропущенные недели (т. Е. без каких-либо сумм в A, B или C), и это то, что мы хотим. Они выглядят так:

 {"num_week":"22","category":"","amount_to_plot":""}
{"num_week":"24","category":"","amount_to_plot":""}
{"num_week":"28","category":"","amount_to_plot":""}
(...)
{"num_week":"52","category":"","amount_to_plot":""}
 

Однако есть побочный эффект, и график выглядит совершенно абсурдно, отображая каждую сумму в количестве 1, включая пустые значения.

Я не уверен, что этот побочный эффект может быть вызван тем фактом, что значения «категория» пусты, а также суммы для построения графика («» вместо «0,00»).

Мой вопрос в том, как это можно исправить? Я открыт для множества методов: изменения SQL-запроса, кода PHP или кода dimple.

Комментарии:

1. Это может (и, весьма вероятно, должно) быть «исправлено» в коде приложения. Однако, если бы это был я, у меня все равно возникло бы искушение начать с того, чтобы посмотреть, можно ли создать более эффективный запрос.

2. Вы правы, это может быть исправлено в коде приложения, учитывая, что «» эквивалентно 0,00 или нулю для сумм. Тем не менее, я мог бы легко решить проблему на уровне PHP, просто не используя функцию utf8ize (), которая здесь была совершенно не нужна и имела побочный эффект. Что касается запроса, я согласен, что он не оптимизирован, но я хочу сохранить три отдельные таблицы, так как это облегчает другие запросы. Таблицы не имеют точно такой же структуры (я упростил вопрос здесь.). Способ передачи данных в столбчатую диаграмму с димплом также довольно болтлив из-за характера димпла.

Ответ №1:

введите описание изображения здесь Было два виновника, один на уровне приложения, другой в моем PHP-коде.

На прикладном уровне проблема возникает из-за того, что библиотеке диаграмм dimple не нравится пустое значение для суммы, которую нужно построить: ... {"num_week":"22","category":"","amount_to_plot":""} ...

Используя статическую строку json, я мог бы подтвердить, что проблема была решена, добавив значения «0.00» : ... {"num_week":"22","category":"","amount_to_plot":"0.00"} ...

Но самым простым решением было адаптировать PHP-код. Проблема была вызвана utf8ize() функцией в моем PHP-коде, которая заменила нулевые значения на «0.00».

Вместо $data = json_encode(utf8ize($amounts),JSON_UNESCAPED_UNICODE);

просто используйте $data = json_encode($amounts); для передачи данных в dimple.

Тогда данные будут выглядеть так ...{"num_week":"22","category":null,"amount_to_plot":null} ...

Если строка json напечатана непосредственно после ее повторения в PHP, она будет выглядеть странно для символов с акцентом (так как будет использоваться кодировка utf-8), но она будет отлично работать в качестве канала данных для диаграммы ямочек, а также для ее легенды.

Еще одним возможным улучшением было бы заменить "category":null "category":<some-existing-category> на, чтобы избежать пустой категории в легенде.