下面是 C# 代码。
问题是计算出来的SumCustomerDebt
。
我需要根据 分组CustomerLocation
,但CustomerDebt
在表中重复多次(针对每个客户)。我需要计算SumCustomerDebt
- 作为CustomerDebt
根据 distinct的总和CustomerID
。我该怎么做?
protected DataTable generateData()
{
DataTable dt = new DataTable();
DataColumn column1 = new DataColumn("salesId", Type.GetType("System.Int32"));
dt.Columns.Add(column1);
DataColumn column2 = new DataColumn("CustomerLocation", Type.GetType("System.String"));
dt.Columns.Add(column2);
DataColumn column3 = new DataColumn("CustomerID", Type.GetType("System.Int32"));
dt.Columns.Add(column3);
DataColumn column4 = new DataColumn("CustomerDebt", Type.GetType("System.Int32"));
dt.Columns.Add(column4);
DataColumn column5 = new DataColumn("SubTotal", Type.GetType("System.Int32"));
dt.Columns.Add(column5);
DataRow dr = dt.NewRow();
dr["salesId"] = 1;
dr["CustomerLocation"] = "Chichago";
dr["CustomerID"] = 1;
dr["CustomerDebt"] = 100;
dr["SubTotal"] = 10;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["salesId"] = 2;
dr["CustomerLocation"] = "Chichago";
dr["CustomerID"] = 1;
dr["CustomerDebt"] = 100;
dr["SubTotal"] = 40;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["salesId"] = 3;
dr["CustomerLocation"] = "Chichago";
dr["CustomerID"] = 2;
dr["CustomerDebt"] = 50;
dr["SubTotal"] = 30;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["salesId"] = 4;
dr["CustomerLocation"] = "Miami";
dr["CustomerID"] = 3;
dr["CustomerDebt"] = 20;
dr["SubTotal"] = 50;
dt.Rows.Add(dr);
return dt;
}
protected void test()
{
DataTable dt = generateData();
var result = from row in dt.AsEnumerable()
group row by new
{
CustomerLocation = row.Field<string>("CustomerLocation"),
} into grp
select new
{
CustomerLocation = grp.Key.CustomerLocation,
SumSubTotal = grp.Sum(r => r.Field<int>("SubTotal")),
OrderCount = grp.Count(),
SumCustomerDebt = grp.Sum(r => r.Field<int>("CustomerDebt")), //this is incorrect, how can i calculate it?
};
foreach (var item in result)
{
string info = string.Format("CustomerLocation={0},SumSubTotal={1},OrderCount={2},SumCustomerDebt={3}", item.CustomerLocation, item.SumSubTotal, item.OrderCount, item.SumCustomerDebt);
Console.WriteLine(info);
}
}