使用DC.js数据表创建一个按年份汇总数据的表

时间:2017-09-08 15:09:20

标签: dc.js crossfilter

我一直在尝试使用dc.js和crossfilter来构建某个数据集中的图表和表格。

到目前为止,构建图表工作正常,但我想使用数据表功能构建一个小的html表来汇总数据,如下所示:

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

我的数据集有大约20 000行,这里有一个数据样本:

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"},
];

到目前为止,这段代码返回每行数据的一行结果,虽然感觉它应该是一个简单的操作,但我无法找出正确的语法构建一个每年一行的汇总表:

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;},
    ]);

我已经无数次尝试过应用

.group().reduceSum()

将维度转换为变量,然后将其传递给.group()参数,但我总是遇到编译错误,我现在很无能为力。

我正在寻找的 SQL 翻译是:

SELECT 
    Year,
    NbEmp = SUM(NbEmploye)

FROM DB

GROUP BY
    Year

ORDER BY 
    Year

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

dataTable的小组is not a group - 是的,将mean something completely different的方法用于所有其他图表中的含义相当令人困惑。在这里,它是一个函数,在任何其他地方它都是一个交叉滤波器对象。

dataTable在dc.js图表​​中是唯一的,因为它从.dimension()对象读取数据。这是因为它默认显示原始数据行而不是聚合数据。

然而,can be used to display a group instead。这是有效的,因为如果您选择显示in descending order,它实际调用维度的唯一方法是.top()

如果您想按升序显示,可以use a fake group to produce an object which supports the .bottom() method