Search code examples
phpmysqlchartsgoogle-visualization

Grouping rows by column value/category in a Google pie chart


I have a table that looks like the following:

sub_note | item_amount | sub_cat       |
---------------------------------------|
Spotify  |  $5.99      | entertainment |
Vodafone |  $35        | phone         |
Netflix  |  $5.99      | entertainment |

I want to display a Google pie chart that tells me how much is being spent per category i.e. Entertainment, Phone etc.

I have used the following adaptation of the Google Quick Start example, but all I'm seeing is a blank chart with 'No data'.

<script type="text/javascript">

  // Load the Visualization API and the corechart package.
  google.charts.load('current', {'packages':['corechart']});

  // Set a callback to run when the Google Visualization API is loaded.
  google.charts.setOnLoadCallback(drawChart);

  // Callback that creates and populates a data table,
  // instantiates the pie chart, passes in the data and
  // draws it.
  function drawChart() {

    // Create the data table.
     var data = new google.visualization.DataTable();
    data.addColumn('string', 'Category');
    data.addColumn('number', 'Total');
    data.addRows([
     <?php 
     $query = "SELECT SUM(sub_amount) AS sub_cat, subs_total FROM subscriptions WHERE sub_user_id ='".$user_id."' GROUP BY sub_cat ORDER BY sub_cat";
      $exec = mysqli_query($connect,$query);
      while($row = mysqli_fetch_array($exec)){
      echo "['".$row['sub_cat']."',".$row['subs_total']."],";
      }
 ?>]);

    // Set chart options
    var options = {'title':'Spending by Category',
                   'width':600,
                   'height':400};

    // Instantiate and draw our chart, passing in some options.
    var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
    chart.draw(data, options);
  }
</script>

It's clear that there's something wrong with the query code and how it's being grouped, but I'm scratching my head trying to figure this out.

Any pointers would be great!

UPDATE: Thanks to @WhiteHat for the SQL correction, here's the functioning code:

<script type="text/javascript">

  // Load the Visualization API and the corechart package.
  google.charts.load('current', {'packages':['corechart']});

  // Set a callback to run when the Google Visualization API is loaded.
  google.charts.setOnLoadCallback(drawChart);

  // Callback that creates and populates a data table,
  // instantiates the pie chart, passes in the data and
  // draws it.
  function drawChart() {

    // Create the data table.
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'Category');
    data.addColumn('number', 'Total');
    data.addRows([
     <?php 
     $query = "SELECT sub_cat, SUM(sub_amount) as subs_total FROM subscriptions WHERE sub_user_id ='".$user_id."' GROUP BY sub_cat ORDER BY sub_cat";
      $exec = mysqli_query($connect,$query);
      while($row = mysqli_fetch_array($exec)){
      echo "['".$row['sub_cat']."',".$row['subs_total']."],";
      }
   ?>]);

    // Set chart options
    var options = {'title':'How Much Pizza I Ate Last Night',
                   'width':600,
                   'height':400};

    // Instantiate and draw our chart, passing in some options.
    var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
    chart.draw(data, options);
  }
</script>

Solution

  • try this sql...

    $query = "SELECT sub_cat, SUM(sub_amount) as subs_total FROM subscriptions WHERE sub_user_id ='".$user_id."' GROUP BY sub_cat ORDER BY sub_cat";

    The category should be the first column and subtotal second.