2017-06-01 1 views
1

Je suis coincé en essayant de "fusionner des tableaux sur la date" pour afficher des données dans les graphiques Google Column. Je voudrais regrouper une liste de problème et leur coût par Année/Mois. Voici mes donnéesFusionner tableau sur la date pour afficher Google Chart

array 
    0 => 
    array 
     'date' => string '2017-03' 
     'source' => string 'Problem 1' 
     'cost' => float 135 
    1 => 
    array 
     'date' => string '2017-03' 
     'source' => string 'Problem 2' 
     'cost' => float 385 
    2 => 
    array 
     'date' => string '2017-04' 
     'source' => string 'Problem 3' 
     'cost' => float 3500 
    3 => 
    array 
     'date' => string '2017-04' 
     'source' => string 'Problem 1' 
     'cost' => float 4437.5 
    4 => 
    array 
     'date' => string '2017-04' 
     'source' => string 'Problem 2' 
     'cost' => float 318 

Si la sortie souhaitée serait https://jsfiddle.net/9d1fzsaf/1/

Si obtenu les données de MySQL groupby Date et source de problème, peut-être devrais-je optimiser la requête?

SELECT DATE_FORMAT(creation_date,'%Y-%m') AS date, 
       (CASE 
         WHEN source_problem = '0' THEN 'Empty' 
         WHEN source_problem = '1' THEN 'Problem 1' 
         WHEN source_problem = '2' THEN 'Problem 2' 
         WHEN source_problem = '3' THEN 'Problem 3' 
         ELSE 'Others' 
       END) AS source, 
          SUM(aprox_cost) AS cost 
         FROM table 
         WHERE source_problem IS NOT NULL 
         GROUP BY DATE_FORMAT(creation_date,'%Y-%m'), 
           source_problem 

Toute aide serait grandement appréciée! Merci

+0

Regrouper vos données lors de l'extraction des enregistrements de requête. –

+0

Merci pour votre réponse, c'est exactement ce que j'essaie de faire $ req-> execute(); '$ results = $ req-> fetchAll(); foreach ($ resultats en $ resultat) { $ data [] = tableau ('date' => $ result ['date'], 'source' => $ result ['source'], 'cost' => (float) $ resultat ['coût']); \t \t} ' Je ne sais pas comment regrouper les données par date ici – kretinus

Répondre

0

afin de produire le tableau dans le violon posté,
chaque source_problem aura besoin d'être une colonne séparée

recommandons de séparer les colonnes dans le sql ...

SELECT 
    DATE_FORMAT(creation_date,'%Y-%m') AS Month, 
    SUM(CASE 
    WHEN source_problem = '0' 
    THEN aprox_cost 
    ELSE 0 
    END) AS Empty, 
    SUM(CASE 
    WHEN source_problem = '1' 
    THEN aprox_cost 
    ELSE 0 
    END) AS Problem1, 
    SUM(CASE 
    WHEN source_problem = '2' 
    THEN aprox_cost 
    ELSE 0 
    END) AS Problem2, 
    SUM(CASE 
    WHEN source_problem = '3' 
    THEN aprox_cost 
    ELSE 0 
    END) AS Problem3, 
    SUM(CASE 
    WHEN source_problem <> '0' AND source_problem <> '1' AND source_problem <> '2' AND source_problem <> '3' 
    THEN aprox_cost 
    ELSE 0 
    END) AS Others 
FROM 
    table 
WHERE 
    source_problem IS NOT NULL 
GROUP BY 
    DATE_FORMAT(creation_date,'%Y-%m') 

également, lors de l'utilisation des données JSON, il doit être en this format,
afin de créer la tabl de données e ... directement

var data = new google.visualization.DataTable(jsonData); 

en tant que tels, construire des résultats similaires à la suite ...

$data = array(); 

$data['cols'] = array(
    array('label' => 'Month', 'type' => 'string') 
    array('label' => 'Empty', 'type' => 'number') 
    array('label' => 'Problem 1', 'type' => 'number') 
    array('label' => 'Problem 2', 'type' => 'number') 
    array('label' => 'Problem 3', 'type' => 'number') 
    array('label' => 'Others', 'type' => 'number') 
); 
$data['rows'] = array(); 

foreach ($results as $result) { 
    $row = array(
    array('v' => (string) $result['Month']) 
    array('v' => (float) $result['Empty']) 
    array('v' => (float) $result['Problem1']) 
    array('v' => (float) $result['Problem2']) 
    array('v' => (float) $result['Problem3']) 
    array('v' => (float) $result['Others']) 
); 
    $data['rows'][] = array('c' => $row); 
} 

echo json_encode($data); 
+0

Thank vous, cela fonctionne bien! – kretinus

+0

à votre santé! heureux de vous aider, veuillez marquer la réponse comme acceptée? – WhiteHat

0

J'ai modifié votre requête mysql. s'il vous plaît ce code utilisé

SELECT DATE_FORMAT(creation_date,'%Y-%m') AS date, 
        (CASE 
          WHEN source_problem = '0' THEN 'Empty' 
          WHEN source_problem = '1' THEN 'Problem 1' 
          WHEN source_problem = '2' THEN 'Problem 2' 
          WHEN source_problem = '3' THEN 'Problem 3' 
          ELSE 'Others' 
        END) AS source, 
           SUM(aprox_cost) AS cost 
          FROM table 
          HAVING source_problem IS NOT NULL 
          GROUP BY date; 
+0

Merci pour votre aide, mais cette requête donne une erreur ' # 1055 - Expression # 2 de la liste SELECT est pas dans la clause GROUP BY et contient non agrégées colonne' – kretinus

+0

J'ai modifié dans le script .. pouvez-vous vérifier les pls. –

+0

Toujours la même erreur, en fait la requête fonctionne mon résultat ressemble à 'date - source_problem - coût 2017-3 - Problème 1 - 100' Mon problème est plus comment faire des graphiques google consomment les données – kretinus