Полный код для решения основного вопроса и комментариев:
function drawTable(response) {
var data = new google.visualization.DataTable();
data.addColumn('string', 'Column1');
data.addColumn('string', 'Column2');
data.addColumn('number', 'Column3');
data.addRows([
['A', 'foo', 100],
['A', 'foo', 200],
['A', 'foo', 100],
['A', 'foo', 100],
['A', 'bar', 200],
['A', 'bar', 300],
['A', 'baz', 300],
['B', 'baz', 200],
['B', 'cad', 300],
['B', 'cad', 400],
['B', 'cad', 100]
]);
// var distinctValues = data.getDistinctValues(2);
var distinctValues = [100, 500, 200, 600, 300, 400];
var viewColumns = [0, 1];
var groupColumns = [];
// build column arrays for the view and grouping
for (var i = 0; i < distinctValues.length; i++) {
viewColumns.push({
type: 'number',
label: distinctValues[i],
calc: (function (x) {
return function (dt, row) {
return (dt.getValue(row, 2) == x) ? 1 : 0;
}
})(distinctValues[i])
});
groupColumns.push({
column: i+2,
type: 'number',
//label: distinctValues[i],
aggregation: google.visualization.data.sum
});
}
//total column
viewColumns.push({
type: 'number',
label: 'Total',
calc: function (dt, row) {
return 1;
}
});
groupColumns.push({
column: distinctValues.length + 2,
type: 'number',
aggregation: google.visualization.data.sum
});
var view = new google.visualization.DataView(data);
view.setColumns(viewColumns);
// next, we group the view on column A, which gets us the pivoted data
var pivotedData = google.visualization.data.group(view, [0, 1], groupColumns);
var control = new google.visualization.ControlWrapper({
'controlType': 'CategoryFilter',
'containerId': 'control',
'options': {
'filterColumnIndex': 0,
'ui': {
'labelStacking': 'vertical',
'caption': 'Select',
'allowTyping': false,
'allowMultiple': false
}
}
});
var table = new google.visualization.ChartWrapper({
'chartType': 'Table',
'containerId': 'table1',
'options': {
'width': '100%',
'showRowNumber' : true
},
});
new google.visualization.Dashboard(document.getElementById('dashboard')).
bind(control, table).
// Configure & bind the controls
draw(pivotedData);
google.visualization.events.addListener(table, 'ready', function() {
var reportview = google.visualization.data.group(table.getDataTable(), [0, 1], groupColumns);
var subTotals = google.visualization.data.group(reportview, [0], groupColumns);
var grandTotal = google.visualization.data.group(reportview, [{
type: 'string',
column: 0,
modifier: function (val) {return null;}
}], groupColumns);
// add subtotals to pivotedData
for (var i = reportview.getNumberOfRows() - 1, oldVal, newVal, row, subIndex; i >= 0; i--) {
newVal = reportview.getValue(i, 0);
if (oldVal != newVal) {
oldVal = newVal;
subIndex = subTotals.getFilteredRows([{column: 0, value: newVal}])[0];
row = [{v: subTotals.getValue(subIndex, 0) + ' Total', p: {style: 'font-style:bold; font-size:22px;'}}, null];
for (var j = 1; j < subTotals.getNumberOfColumns(); j++) {
row.push({v: subTotals.getValue(subIndex, j), p: {style: 'font-style:bold; font-size:22px;'}});
}
reportview.insertRows(i + 1, [row]);
}
}
// add grand total to pivotedData
var row = [{v: 'Grand Total', p: {style: 'font-style:bold; font-size:22px;'}}, null];
for (var i = 1; i < grandTotal.getNumberOfColumns(); i++) {
row.push({v: grandTotal.getValue(0, i), p: {style: 'font-style:bold; font-size:22px;'}});
}
reportview.addRow(row);
var table2 = new google.visualization.Table(document.getElementById('table2'));
table2.draw(reportview, {'width': '100%', 'showRowNumber' : true, allowHtml: true});
});
}
jsfiddle: http://jsfiddle.net/asgallant/DUn6B/15/
К сожалению, Visualization API таблица не поддерживает '' rowspan' и colspan' атрибуты, которые необходимо использовать для создания этого макета. – asgallant
Есть ли способ найти промежуточные итоги 'A' и' B' и его общую сумму без 'rowspan' и' colspan', как [на этом изображении] (http://i.stack.imgur.com/WZk7r.png) – user3102065
Да, вы можете вставить новые строки в свой DataTable, содержащие промежуточные итоги «A» и «B» и «Grand Total». См. Этот пример: http://jsfiddle.net/asgallant/DUn6B/9/ – asgallant