web-dev-qa-db-ja.com

DataTableからピボットテーブルを作成する

C#winformsを使用して、データテーブルをピボットテーブルに変換する必要があるアプリケーションを作成しています。 SQL側からはピボットテーブルが正常に機能していますが、データテーブルから作成するのは難しいようです。このために.NETに組み込まれているものを見つけることができなかったようです。

注:ピボットを作成する前にデータを操作するため、.NET側からこれを行う必要があります。

私はこれと同じようなことをするいくつかの記事を読みましたが、問題にそれらを適用するのは困難でした。

*「StartDateTime」、「Tap」、「Data」の列を持つデータテーブルがあります。開始日は一緒にグループ化し、データ値を平均化する必要があります(開始日ごとに複数のデータ値がある場合があります)。表を以下に示します。

enter image description here

ピボットテーブルは下の画像のように出力されます(ただし、丸められた値ではありません)。列番号は、個別のタップ番号です(一意の番号ごとに1つ)。

Pivot Table

データテーブルからこのピボットテーブルを作成するにはどうすればよいですか?

編集:言及するのを忘れた、これらのタップ値は常に1〜4であるとは限らず、数と値は異なります。

12
ImGreg

ハッシュピボットテスジを学ぶ:

var inDT = new DataTable();
// Fill the input table

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);
    }
}
// pivot table in oDT
5
Joshua

そのようなピボットテーブルは無料で簡単に計算できます NReco.PivotData 集計ライブラリ:

_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);
_

行キーと列キーは、pvtTbl.RowKeysおよびpvtTbl.ColumnKeysコレクションで表されます。値/合計は、インデクサー(例:_pvtTbl[0,0].Value_)または行+列キー(例:pivotData[new Key(new DateTime(2012, 3, 30, 11, 42, 00)), new Key(4)].Value)によってアクセスできます。

3

必要なテーブルをピボットする別の小さなコード:

        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