Sort pivot table PivotData C# examples


By default rows and columns in a PivotTable model are ordered by labels (A-Z).

Sort by labels

Custom order for dimension keys (labels) can be defined with PivotTable constructor that accepts IComparer<ValueKey> implementations for rows and columns (null = default A-Z comparer). The following code snippet sorts table columns by labels in descending order (Z-A):

IPivotData pvtData; // cube instance
var pvtTbl = new PivotTable( 
  new[] {"Product"},  // rows
  new[] {"Country"},  // columns
  pvtData,
  new CustomSortKeyComparer(new[] {  // rows comparer
    NaturalSortKeyComparer.Instance }),
  new CustomSortKeyComparer(new[] { // column comparer
    NaturalSortKeyComparer.ReverseInstance })  
);

If several dimensions are used individual comparers should be provided for dimension separately.

← (Z-A)

(A-Z)
  Germany Belgium Austria
Product1 15 17 5
Product2 10 1
Product3 2 7

CustomSortKeyComparer accepts list of IComparer<object> for each dimension specified for rows or column axis.

In some cases labels order should be defined explicitely (like month names or days of the week) with SortAsComparer:

IPivotData pvtData; // cube instance with "Year" (number) and "Month" (Jan, Feb, Mar etc) dimensions
var pvtTbl = new PivotTable( 
  new[] {"Year"},  // rows
  new[] {"Month"},  // columns
  pvtData,
  null,  // leave default A-Z order for rows
  new CustomSortKeyComparer(new[] {  // columns comparer
    new SortAsComparer(new [] {"Jan","Feb","Mar","Apr",
	  "May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"})
  })  
);
(explicit order)

(A-Z)
  Feb Mar May Dec
2014 15 17 5 20
2015 10 1 5
2016 2 7 6

Sort by values

Pivot table can be ordered by values with the following methods:

column #3 (Dec) asc
row #2 (2014) asc   May Feb Mar Dec
2015 10 1 5
2016 7 2 6
2014 5 15 17 20
PivotTable pvtTbl;  // model from the code snippet above
pvtTbl.SortRowKeys( 3, ListSortDirection.Ascending );  // sort rows by column #3 values
pvtTbl.SortColumnKeys( 2, ListSortDirection.Ascending );  // sort columns by row #2 values

// apply the same order by dimension keys (labels) instead of indexes
pvtTbl.SortRowKeysByColumnKey( new ValueKey("Dec"), 0 /*measureIndex*/, ListSortDirection.Ascending );
pvtTbl.SortColumnKeysByRowKey( new ValueKey(2014), 0 /*measureIndex*/, ListSortDirection.Ascending );
null can be used instead of index for ordering by totals.
If CompositeAggregator is used for several measures, it is possible to specify exact measure index with appropriate SortRowKeys/SortColumnKeys overload.

Customize labels sorting in web pivot builder PivotData Toolkit

In ToolkitPivotBuilderMvc example (online demo) pivot table is created with help of PivotTableFactory and sorting options are provided with PivotTableConfiguration model:

IPivotData pvtData;  // cube instance
var pvtTblFactory = new PivotTableFactory();
var pvtTbl = pvtTblFactory.Create(pvtData,
  new PivotTableConfiguration() {
    Rows = new[] {"Product"},
    Columns = new[] {"Country"},

    SortByValue = new PivotTableConfiguration.AxisValuesOrder(
      PivotTableConfiguration.TableAxis.Rows,  // sort rows 
      0,  // values column index 
      ListSortDirection.Descending ),

    OrderKeys = new PivotTableConfiguration.AxisKeysOrder[] { 
      new PivotTableConfiguration.AxisKeysOrder(
        PivotTableConfiguration.TableAxis.Columns, 
        0,  // axis dimension index
        ListSortDirection.Descending )
	}	
  } );

Sorting is performed by PivotTableFactory and if custom comparers should be used for certain dimensions they may be specified with RegisterDimensionComparer method:

var pvtTblFactory = new PivotTableFactory();
pvtTblFactory.RegisterDimensionComparer("Month", 
  new SortAsComparer(
    new [] {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"}
  ) 
);