Demo - Calculated Fields

HTML

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.grapecity.com/wijmo/5.latest/styles/wijmo.min.css">
<script src="https://cdn.grapecity.com/wijmo/5.latest/controls/wijmo.min.js"></script>
<script src="https://cdn.grapecity.com/wijmo/5.latest/controls/wijmo.input.min.js"></script>
<script src="https://cdn.grapecity.com/wijmo/5.latest/controls/wijmo.grid.min.js"></script>
<script src="https://cdn.grapecity.com/wijmo/5.latest/controls/wijmo.grid.filter.min.js"></script>
<script src="https://cdn.grapecity.com/wijmo/5.latest/controls/wijmo.olap.min.js"></script>
<script src="https://cdn.grapecity.com/wijmo/5.latest/controls/wijmo.chart.min.js"></script>
<div class="container">
  <div class="row">
    <div class="col-xs-6">
      <div id="pivotPanel"></div>
    </div>
  </div>
  <div class="row">
    <div class="col-xs-6">
      <div id="pivotGrid"></div>
      <div id="pivotChart"></div>
    </div>
  </div>  
</div>

CSS

.wj-pivotgrid {
	max-height: 400px;
  width: 800px;
}
.wj-pivotchart {
	max-height: 400px;
  width: 800px;
}
.wj-pivotgrid .wj-cell.spark {
	padding: 8px;
  overflow: visible;
}
	.wj-pivotgrid .wj-cell.spark svg {
  	overflow: visible;
    stroke: currentColor;
    fill: currentColor;
  }
	  .wj-pivotgrid .wj-cell.spark.spark-up svg {
  		color: #009000; /* green for up */
		}
  	.wj-pivotgrid .wj-cell.spark.spark-down svg {
	  	color: #d00000; /* red for down */
	  }

body {
  margin-bottom: 48pt;
}

JavaScript

onload = function() {

	// create a PivotEngine with a custom view
  var ng = new wijmo.olap.PivotEngine({
  	autoGenerateFields: false,
    itemsSource: getData(1),
    showColumnTotals: 'GrandTotals',
    fields: [
    	{ binding: 'date', header: 'Date', format: 'yyyy-mm-dd' },
			{ binding: 'period', header: 'Period' },
			{ binding: 'id', header: 'Id' },
      { binding: 'bucket', header: 'Bucket' },
      { binding: 'group', header: 'Group'},
      { binding: 'volume', header: 'V', format: 'n0' },
      {
      	header: 'mS',
        dataType: 'Number',
        aggregate: 'Avg',
        format: 'p0'
			}
    ],
    rowFields: ['Date', 'Id', 'Bucket'],
    valueFields: ['mS']
	});

  // show panel
  var pivotPanel = new wijmo.olap.PivotPanel('#pivotPanel', {
  	itemsSource: ng
	});

  // show summary
  var pivotGrid = new wijmo.olap.PivotGrid('#pivotGrid', {
  	isReadOnly: true,
    itemsSource: ng
	});
  pivotGrid.formatItem.addHandler((s,e)=>{
  	if(e.panel.cellType != wijmo.grid.CellType.Cell){
    	return;
    }
    
    // is ms column
    let binds = e.panel.columns[e.col].binding.split(';');
    if(binds.indexOf('mS:0') < 0){
    	return;
    }
    
    // get data for cell
    let data = pivotGrid.getDetail(e.row, e.col);
    // get custom aggregate
    let avg = getCustomMsAvg(data);
    // format value
    let formatted = wijmo.Globalize.formatNumber(avg, 'p0');
    e.cell.innerHTML = formatted;
  });
  
  /* var pivotChart = new wijmo.olap.PivotChart('#pivotChart', {
  itemsSource: ng,
  stacking: 'Bar'
  }); */

	// gets a simple data set for basic demos
  function getData(cnt) {
  	var year = new Date().getFullYear(),
    		data = [];
		for (var i = 0; i < cnt; i++) {
    	data.push({date: new Date(2018, 11, 10), id: 'SX', bucket: '[30,40]', period: 'IntraDay', group:'own', volume:50})
    	data.push({date: new Date(2018, 11, 10), id: 'SX', bucket: '[30,40]', period: 'IntraDay', group:'market', volume:1000})      
			data.push({date: new...