One of the nice features of ag-grid (which is a kick-ass HTML 5 grid) is the ability to define an aggregate function for a given column - i.e. when grouping data, what calculation should you use for a given numeric column. Out of the box, there's support for a bunch of basic functions (sum, average, etc.), but one that's missing is a weighted average, which is extremely important in some domains (like finance).
A weighted average is defined as:
weighted average (colA weighted by colB) = SUM(colA * colB) / SUM(colB)
After a little poking around, I figured out the following solution within ag-grid:
var gridOptions = {
...
groupRowAggNodes: groupRowAggNodes,
};
...
function groupRowAggNodes(nodes) {
let result = {
colA: 0,
colB: 0
};
let sumColB = 0;
let sumProduct = 0;
nodes.forEach(node => {
var data = node.group ? node.aggData : node.data;
sumColB += data.colB;
sumProduct += (data.colA * data.colB);
});
result.colB = sumColB;
result.colA = sumProduct / sumColB;
return result;
}
If your aggregation function is in terms of just that column, then colDef.aggFunc
is fine, but if you need to "reach" into other columns in order to calculate, then the groupRowAggNodes() is what you want to use. You can find the entire solution on Plunker here.