2017-09-08 2 views
1

J'ai essayé d'utiliser dc.js et crossfilter pour créer des graphiques et des tables à partir d'un certain ensemble de données.Utilisation de DC.js datatable pour créer une table avec des données agrégées par année

graphiques bâtiment Jusqu'à présent, fonctionne très bien, mais je veux utiliser la fonctionnalité datatable pour construire une petite table html pour résumer les données comme suit:

|Year|TotalEmployees| 
|2015|555| 
|2016|666| 
|2017|777| 

Mon jeu de données a environ 20 000 lignes, voici un échantillon des données:

var data = [ 
{"Year":"2015","Category":"1","NbEmployee":"51"}, 
{"Year":"2015","Category":"2","NbEmployee":"31"}, 
{"Year":"2015","Category":"3","NbEmployee":"14"} 
{"Year":"2016","Category":"1","NbEmployee":"51"}, 
{"Year":"2016","Category":"2","NbEmployee":"55"}, 
{"Year":"2016","Category":"3","NbEmployee":"65"}, 
{"Year":"2017","Category":"1","NbEmployee":"76"}, 
{"Year":"2017","Category":"2","NbEmployee":"98"}, 
]; 

jusqu'à présent, ce morceau de code renvoie une ligne de résultat par ligne de données, et bien qu'il se sent comme il devrait être une manipulation simple, je ne peux pas trouver la bonne syntaxe construire da résumé table avec une ligne par année:

var ndx = crossfilter(data); 
var tableDim = ndx.dimension(function(d) { 
    return d.Year; 
}); 

var datatable = dc.dataTable("#dc-data-table"); 

datatable 
    .dimension(tableDim) 
    .group(function(d) { 
     d.NbEmployee += d.NbEmployee; 
     return d.Year; 
     }) 
    .columns([ 
     function(d) {return d.Year;}, 
     function(d) {return d.NbEmployee;}, 
    ]); 

J'ai essayé de nombreuses fois d'appliquer les

.group().reduceSum() 

fonctions à la dimension dans une variable et passer ensuite au paramètre .group() , mais je finis toujours avec une erreur de compilation, je suis assez désemparé en ce moment.

La traduction SQL de ce que je suis à la recherche est la suivante:

SELECT 
    Year, 
    NbEmp = SUM(NbEmploye) 

FROM DB 

GROUP BY 
    Year 

ORDER BY 
    Year 

Merci d'avance pour votre aide!

Répondre

2

Le groupe dataTableis not a group - oui, assez déroutant d'utiliser cette méthode à mean something completely different de ce que cela signifie dans tous les autres tableaux. Ici, c'est une fonction, partout ailleurs c'est un objet crossfilter.

Le dataTable est unique en dehors des diagrammes dc.js en ce sens qu'il lit ses données à partir de l'objet .dimension(). C'est parce qu'il affiche les lignes brutes de données, plutôt que des données agrégées, par défaut.

Cependant, il can be used to display a group instead. Cela fonctionne parce que la seule méthode qu'il appelle réellement sur la dimension est .top(), si vous choisissez d'afficher in descending order. Si vous souhaitez afficher dans l'ordre croissant, vous pouvez use a fake group to produce an object which supports the .bottom() method.

+0

Merci pour l'information, mais j'ai choisi de construire ma table de données avec C# Razor depuis que j'ai beaucoup de différentes tables à construire et DC.js n'est malheureusement pas aussi convivial pour les tables que je le voudrais. –

+1

Bien sûr, compris - dc.js dataTable est à peine une preuve de concept. Quand les gens veulent quelque chose de plus agréable, ils se déplacent souvent sur DataTables.js ou similaire, en les connectant aux événements DC et aux données crossfilter. Pour toute personne rencontrant cela plus tard, voir par ex. les réponses pour https://stackoverflow.com/questions/21596616/dc-js-data-table-using-jquery-data-table-plugin, qui pourraient être améliorées mais fondamentalement la bonne idée. – Gordon