我有一个透视数据表,其中列是位置,大约有100个。数据有点奇怪,我正在寻找一种简单的方法来求和(或折叠数据)。
Date, Location 1, Location 2, Location 3
1/1/2001, 6, 0, 0
2/1/2001, 10, 0, 0
1/1/2001, 0, 5, 0
2/1/2001, 0, 4, 0
1/1/2001, 0, 0, 8
2/1/2001, 0, 0, 2
所以你可以看到零填充物,所以如果我要总结一下,我会得到唯一的日期列表和一个"崩溃的"结果没有零填充。
同样,我有大约100个列并且它们不能被硬编码,所以需要一种方法来动态地对所有这些列求和。有这个诀窍吗?也许在Linq?
答案 0 :(得分:1)
如果第一列始终是日期而其余列总是总和,则可以在每行上迭代ItemArray
DataTable dt = new DataTable();
var sums = new Dictionary<DateTime, int>();
foreach(DataRow dr in dt.Rows)
{
int sum = 0;
for(int i = 1; i < dr.ItemArray.Length; i++)
{
sum += (int)dr.ItemArray[i];
}
sums.Add((DateTime)dr.ItemArray[0], sum);
}
答案 1 :(得分:1)
我会使用循环和LINQ的组合:
DataTable pivotedTable = table.Clone(); // same columns, empty
var pivotColumns = pivotedTable.Columns.Cast<DataColumn>().Skip(1).ToList();
var dateGroups = table.AsEnumerable()
.GroupBy(r => r.Field<DateTime>("Date").Date);
foreach(var date in dateGroups)
{
DataRow row = pivotedTable.Rows.Add(); // already added to table now
row.SetField("Date", date.Key);
foreach(DataColumn c in pivotColumns)
row.SetField(c, date.Sum(r => r.Field<int>(c.ColumnName)));
}
以下是您的示例数据:
DataTable table = new DataTable();
table.Columns.Add("Date", typeof(DateTime));
table.Columns.Add("Location 1", typeof(int));
table.Columns.Add("Location 2", typeof(int));
table.Columns.Add("Location 3", typeof(int));
table.Rows.Add(new DateTime(2001, 1, 1), 6, 0, 0);
table.Rows.Add(new DateTime(2001, 2, 1), 10, 0, 0);
table.Rows.Add(new DateTime(2001, 1, 1), 0, 5, 0);
table.Rows.Add(new DateTime(2001, 2, 1), 0, 4, 0);
table.Rows.Add(new DateTime(2001, 1, 1), 6, 0, 8);
table.Rows.Add(new DateTime(2001, 1, 1), 6, 0, 2);
输出:
Date Location 1 Location 2 Location 3
01.01.2001 00:00:00 18 5 10
01.02.2001 00:00:00 10 4 0