Выберите два разных столбца даты из двух разных таблиц и сгруппируйте обе даты по месяцам - PullRequest
0 голосов
/ 07 апреля 2020

Я застрял здесь довольно сильно, и мне нужна помощь, пожалуйста! У меня есть две таблицы: cost_t и budget_t.

Вот моя таблица бюджета, где родители могут иметь нескольких детей и назначать им бюджет.

budget_t:

bud_id   bud_date   bud_amount  bud_category   chi_id  par_id
------  ----------  ----------  -------------  ------  ------
  1     2020-03-01      200         Food         1       1
  2     2020-03-01      100     Entertainment    1       1
  3     2020-04-01      200         Food         2       2
  4     2020-04-01      100     Entertainment    3       2

Вот моя таблица расходов, здесь регистрируются расходы детей.

exp_id   exp_date   exp_amount  exp_category   chi_id
------  ----------  ----------  -------------  ------
  1     2020-03-10      50          Food         1   
  2     2020-03-20      50      Entertainment    1  
  3     2020-04-15      20          Food         2   
  4     2020-05-31      50          Food         1   

Я пытаюсь сделать следующее: линейный график с MONTH (например, March) на оси X, в то время как total bud_amount и total exp_amount для этого указанного c месяца для указанного c дочернего элемента на оси Y. Например, линейная диаграмма для chi_id = "1" будет выглядеть следующим образом: -

Line Chart Graph for chi_d=

Я не могу понять asp понимания того, как SQL запросы работают, так как я все еще новичок в этом! Но это SQL запросы, которые я пробовал, но они не работали. Третий запрос, кажется, работает, но только для одной таблицы .. Я не знаю, как объединить обе таблицы вместе.

SELECT exp_date, DATE_FORMAT(exp_date, '%Y-%m-01') AS month, sum(exp_amount) AS expense, sum(bud_amount) AS budget FROM expense_t INNER JOIN budget_t ON
expense_t.chi_id=budget_t.chi_id WHERE (exp_date BETWEEN "2019-04-07" AND "2020-04-07") AND expense_t.chi_id="1" GROUP BY month ORDER BY month // the sum for both amounts went crazy

SELECT exp_date, EXTRACT(MONTH FROM exp_date) AS month, sum(exp_amount) AS expense, sum(bud_amount) AS budget FROM expense_t INNER JOIN budget_t ON
expense_t.chi_id=budget_t.chi_id WHERE (exp_date BETWEEN "2019-04-07" AND "2020-04-07") AND expense_t.chi_id="1" GROUP BY month ORDER BY month // the sum for both amounts went crazy too

SELECT EXTRACT(MONTH FROM exp_date) AS month, sum(exp_amount) AS expense FROM expense_t WHERE (exp_date BETWEEN "2019-04-07" AND "2020-04-07")
AND chi_id="1" GROUP BY month ORDER BY month // the sum and month are perfectly fine but no idea how to                                             combine with budget_t table.

Требуются результаты от SQL запросов (общий бюджет и расходы для уточнения c месяц (взят из даты) для специфики c chi_id: -

month   total_budget  total_expense  chi_id
-----   ------------  -------------  ------
March       300           100          1   
April         0             0          1  
May           0            50          1
etc...

Вот мой PHP код: -

<?php
include('conn.php');
if (!isset($c_id)) {
  $c_id = $_GET['c_id'];
}
$sql = "Please-help-me!";
$result = mysqli_query($conn, $sql);
if(mysqli_num_rows($result)<=0)
{
  die("<script>alert('Sorry, there is not info to generate chart. Please try again after you have recorded more expenses!'); window.history.go(-1);</script>");
}
else
{
  $row = mysqli_fetch_array($result);
  ?>
  <html>
  <head>
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/font-awesome.min.css" rel="stylesheet">
    <link href="css/datepicker3.css" rel="stylesheet">
    <link href="css/styles.css" rel="stylesheet">
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script type="text/javascript">
    google.charts.load('current', {'packages':['corechart']});
    google.charts.setOnLoadCallback(drawChart);

    function drawChart() {
      var data = google.visualization.arrayToDataTable([
        ['Date', 'Budget', 'Expense'],
        <?php
        while($row=mysqli_fetch_array($result))
        {
          echo "['".$row["month"]."', '".$row['budget']."', '".$row['expense']."'],";
        }
        ?>
      ]);

      var options = {
        title: 'Budget-Expense Line Chart for <?php echo "$user" ?>',
        curveType: 'function',
        pointSize: 10,
        legend: { position: 'right' }
      };

      var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));

      chart.draw(data, options);
    }
    </script>
  </head>
  <body>
    <div id="curve_chart" style="width: 900px; height: 500px"></div>
  </body>
  <?php
}
?>
</html>

1 Ответ

0 голосов
/ 07 апреля 2020
SELECT year_and_month, 
       SUM(total_budget) total_budget,
       SUM(total_expense) total_expense,
       chi_id
FROM ( SELECT DATE_FORMAT(bud_date, '%y-%m') year_and_month,
              SUM(bud_amount) total_budget,
              0 total_expense,
              chi_id
       FROM budget_t
       GROUP BY DATE_FORMAT(bud_date, '%y-%m'),
                chi_id

       UNION ALL

       SELECT DATE_FORMAT(exp_date, '%y-%m'),
              0,
              SUM(exp_amount),
              chi_id
       FROM expense_t
       GROUP BY DATE_FORMAT(exp_date, '%y-%m'),
                chi_id
     ) total
GROUP BY year_and_month, 
         chi_id
...