且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

从DataTable创建数据透视表

更新时间:2023-02-03 16:57:55

了解hash-pivot tesuji:

  var oDT = new数据表
var dfq = new Dictionary< DateTime,DataRow&gt ;;
oDT.Columns.Add(StartDateTime,typeof DateTime); (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);
}
}


I am using C# winforms to create an application that needs to turn a datatable into a pivot table. I have the pivot table working fine from a SQL end, but creating it from a datatable seems trickier. I couldn't seem to find anything built into .NET for this.

NOTE: I do have to do this from a .NET side as I manipulate the data prior to creating the pivot.

I've read through some articles that did some similar things as this, but I've had difficultly applying them to my problem.

*I have a datatable with the columns "StartDateTime", "Tap", and "Data". The startdates should be grouped together and data values averaged (sometimes more than one data value per startdate). The table is shown below:

Pivot table should output like the image below (not rounded values though). The column numbers are the distinct tap numbers (one for each unique one).

How can I go about creating this pivot table from the datatable?

EDIT: forgot to mention, these tap values are not always from 1-4, they do vary in number and value.

Learn the hash-pivot tesuji:

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