Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不同的组字段上平均执行求和_C#_Linq_Linq To Sql - Fatal编程技术网

C# 如何在不同的组字段上平均执行求和

C# 如何在不同的组字段上平均执行求和,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,问题是计算出的SumCustomerDebt 我需要根据CustomerLocation进行分组,但是CustomerDeb不能在表中为每个客户重复多次,值不同。我需要将SumCustomerDebt计算为每个客户的CustomerDebt之和。对于每个客户,CustomerDebt是CustomerDebt的平均值 我怎么做 这是我的C代码 protected DataTable generateData() { DataTable dt = new DataTable();

问题是计算出的SumCustomerDebt

我需要根据CustomerLocation进行分组,但是CustomerDeb不能在表中为每个客户重复多次,值不同。我需要将SumCustomerDebt计算为每个客户的CustomerDebt之和。对于每个客户,CustomerDebt是CustomerDebt的平均值

我怎么做

这是我的C代码

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"] = 80;
    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);

    }

}
打印的信息应包含两行: 1 CustomerLocation=Chichago,SumSubTotal=80,OrderCount=3,SumCustomerDebt=150->SumCustomerDebt=140=90,客户ID=1100+80/2平均值+50,客户ID=2
2 CustomerLocation=Miami,SumSubTotal=50,OrderCount=1,SumCustomerDebt=20

那么您想执行双重分组-首先按位置,然后按客户id?第二组应该取平均值,第一组求和?SumCustomerDebt应该是140,对吗?请查看我的答案我需要什么:-
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.GroupBy(r=> r.Field<int>("CustomerID"))
                                           .Sum(g => g.Average(r=> r.Field<int>("CustomerDebt"))),
                  };


    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);    
    }
}
CustomerLocation=Chichago,SumSubTotal=80,OrderCount=3,SumCustomerDebt=140
CustomerLocation=Miami,SumSubTotal=50,OrderCount=1,SumCustomerDebt=20