web-dev-qa-db-fra.com

Créer un tableau croisé dynamique à partir d'un DataTable

J'utilise Winforms C # pour créer une application qui doit transformer un datatable en tableau croisé dynamique. Le tableau croisé dynamique fonctionne correctement à partir d'une extrémité SQL, mais sa création à partir d'un fichier datatable semble plus délicat. Je n'arrivais pas à trouver quoi que ce soit construit dans .NET pour cela. 

Remarque: je dois le faire à partir d'un côté .NET que je manipule les données avant de créer le pivot.

J'ai lu des articles qui faisaient des choses similaires, mais j'ai eu du mal à les appliquer à mon problème. 

* J'ai un datatable avec les colonnes "StartDateTime", "Tap", et "Data". Les dates de début doivent être regroupées et les valeurs des données moyennées (parfois plus d'une valeur de données par date de début). Le tableau est présenté ci-dessous:

enter image description here

Le tableau croisé dynamique devrait ressembler à l'image ci-dessous (les valeurs ne sont toutefois pas arrondies). Les numéros de colonne sont les numéros de prise distincts (un pour chaque unique).

Pivot Table

Comment puis-je créer ce tableau croisé dynamique à partir du datatable? 

ÉDITER: j'ai oublié de mentionner, ces valeurs de prise ne sont pas toujours comprises entre 1 et 4, elles varient en nombre et en valeur.

11
ImGreg

Un tableau croisé dynamique comme celui-ci peut être facilement calculé avec free NReco.PivotData bibliothèque d'agrégation:

DataTable t;  // assume it has: StartDateTime, Data, Tap
var pivotData = new PivotData(
    new string[] {"StartDateTime","Tap"},
    new AverageAggregatorFactory("Data"),
    new DataTableReader(t) );
var pvtTbl = new PivotTable(
    new [] {"StartDateTime"},  // row dimension(s)
    new [] {"Tap"}, // column dimension(s),
    pivotData);

Les clés de ligne et de colonne sont représentées par les collections pvtTbl.RowKeys et pvtTbl.ColumnKeys; les valeurs/totaux peuvent être accédés par indexeur (par exemple: pvtTbl[0,0].Value) ou par clé de ligne + colonne (par exemple: pivotData[new Key(new DateTime(2012, 3, 30, 11, 42, 00)), new Key(4)].Value).

4

Apprenez le tesuji de pivot de hachage:

var oDT = new DataTable;
var dfq = new Dictionary<DateTime, DataRow>;
oDT.Columns.Add("StartDateTime", typeof DateTime);
for (int i = 0; i < inDT.Rows.Count; i++) {
  var key = (DateTime)inDT.Rows[i][0];
  var row = (String)inDT.Rows[i][2];
  var data = (Double)inDT.Rows[i][1];
  if (!oDT.Columns.Contains(row))
      oDT.Columns.Add(row);
  if (dfq.ContainsKey(key)) {
      dfq[key][row] = data;
  } else {
      var oRow = oDT.NewRow();
      oRow[0] = key;
      oRow[row] = data;
      dfq.Add(key, oRow);
      oDT.Rows.Add(oRow);
  }
}
4
Joshua

Un autre petit morceau de code pour faire pivoter n’importe quelle table:

        var dataTable = new DataTable(); // your input DataTable here!
        var pivotedDataTable = new DataTable(); //the pivoted result
        var firstColumnName = "Year";
        var pivotColumnName = "Codes";

        pivotedDataTable.Columns.Add(firstColumnName);

        pivotedDataTable.Columns.AddRange(
            dataTable.Rows.Cast<DataRow>().Select(x => new DataColumn(x[pivotColumnName].ToString())).ToArray());

        for (var index = 1; index < dataTable.Columns.Count; index++)
        {
            pivotedDataTable.Rows.Add(
                new List<object> { dataTable.Columns[index].ColumnName }.Concat(
                    dataTable.Rows.Cast<DataRow>().Select(x => x[dataTable.Columns[index].ColumnName])).ToArray());
        }
0
Andrei Olaru