我有一个这样的数据表(付款月份列为日期)
PaymentMonth Amount
01/01/2014 100
01/02/2014 200
01/03/2014 200
01/01/2015 300
01/02/2015 300
01/01/2016 200
我需要输出数据表如下(通过使用paymonth列中的年份分组)
Year Amount
2014 500
2015 600
2016 200
使用linq获取输出数据表或在c#
中计算由于 M. Prabhu
答案 0 :(得分:3)
你需要这样的东西:
var result = datatable.AsEnumerable()
.GroupBy(r => DateTime.Parse(r["PaymentMonth"].ToString()).Year)
.Select(x=> new { Year = x.Key,
Amount = x.Sum(r=>Int32.Parse(r["Amount"])
}
).OrderBy(x=>x.Year);
我认为PaymentMonth
是DateTime
个对象,data
是保存数据的集合。
答案 1 :(得分:1)
作为一项学习练习,我已经完成了如下操作。我是LINQ的新手,所以不能保证这是否是最有效的方式,但它是有效的并且可以自我解释。
DataTable dt = new DataTable();
dt.Columns.Add("PaymentMonth", typeof(System.DateTime));
dt.Columns.Add("Amount", typeof(int));
dt.Rows.Add(new DateTime(2014, 1, 1), 100);
dt.Rows.Add(new DateTime(2014, 2, 1), 200);
dt.Rows.Add(new DateTime(2014, 3, 1), 200);
dt.Rows.Add(new DateTime(2015, 1, 1), 300);
dt.Rows.Add(new DateTime(2015, 2, 1), 300);
dt.Rows.Add(new DateTime(2016, 1, 1), 200);
var sumResult = from amt in dt.AsEnumerable()
group amt by amt.Field<System.DateTime>("PaymentMonth").Year into agg
select new { Year=agg.Key,SumAmount=agg.Sum(r=>r.Field<int>("Amount")) };
DataTable dtAgg = new DataTable();
dtAgg.Columns.Add("Year",typeof(int));
dtAgg.Columns.Add("Amount", typeof(int));
foreach(var item in sumResult)
{
dtAgg.Rows.Add(item.Year, item.SumAmount);
}
DataTable dtAgg现在包含聚合数据,如下所示
Year Amount
2014 500
2015 600
2016 200