【发布时间】:2016-03-11 04:27:30
【问题描述】:
我找到了这个link
那里的代码可以使用数据透视值和数据透视列对数据表进行透视。我需要的是基于日期旋转并保留所有其他值列,如下所示:
Date Column1 Column2 Column3
2010 10 20 30
2011 40 50 60
到这里,我将列名作为第一行以及它们在年份下的值:
2010 2011
Column1 10 40
Column2 20 50
Column3 30 60
这是我现在的代码:
DataTable Pivot(DataTable dt, DataColumn pivotColumn, DataColumn pivotValue) {
// find primary key columns
//(i.e. everything but pivot column and pivot value)
DataTable temp = dt.Copy();
temp.Columns.Remove( pivotColumn.ColumnName );
temp.Columns.Remove( pivotValue.ColumnName );
string[] pkColumnNames = temp.Columns.Cast<DataColumn>()
.Select( c => c.ColumnName )
.ToArray();
// prep results table
DataTable result = temp.DefaultView.ToTable(true, pkColumnNames).Copy();
result.PrimaryKey = result.Columns.Cast<DataColumn>().ToArray();
dt.AsEnumerable()
.Select(r => r[pivotColumn.ColumnName].ToString())
.Distinct().ToList()
.ForEach (c => result.Columns.Add(c, pivotColumn.DataType));
// load it
foreach( DataRow row in dt.Rows ) {
// find row to update
DataRow aggRow = result.Rows.Find(
pkColumnNames
.Select( c => row[c] )
.ToArray() );
// the aggregate used here is LATEST
// adjust the next line if you want (SUM, MAX, etc...)
aggRow[row[pivotColumn.ColumnName].ToString()] = row[pivotValue.ColumnName];
}
return result;
}
如何使用多个列值实现此结果?
【问题讨论】:
-
有问题吗?
-
是的,如何使用 c# 达到预期的效果?当我现在进行旋转时,我只能使用一个值列。