C#winformsを使用して、データテーブルをピボットテーブルに変換する必要があるアプリケーションを作成しています。 SQL側からはピボットテーブルが正常に機能していますが、データテーブルから作成するのは難しいようです。このために.NETに組み込まれているものを見つけることができなかったようです。
注:ピボットを作成する前にデータを操作するため、.NET側からこれを行う必要があります。
私はこれと同じようなことをするいくつかの記事を読みましたが、問題にそれらを適用するのは困難でした。
*「StartDateTime」、「Tap」、「Data」の列を持つデータテーブルがあります。開始日は一緒にグループ化し、データ値を平均化する必要があります(開始日ごとに複数のデータ値がある場合があります)。表を以下に示します。
ピボットテーブルは下の画像のように出力されます(ただし、丸められた値ではありません)。列番号は、個別のタップ番号です(一意の番号ごとに1つ)。
データテーブルからこのピボットテーブルを作成するにはどうすればよいですか?
編集:言及するのを忘れた、これらのタップ値は常に1〜4であるとは限らず、数と値は異なります。
ハッシュピボットテスジを学ぶ:
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
そのようなピボットテーブルは無料で簡単に計算できます 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
)によってアクセスできます。
必要なテーブルをピボットする別の小さなコード:
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());
}