public static DataTable Group(DataTable tb, string group_fields, string sum_fields) { var dt = tb.Copy(); tb = tb.Copy(); string[] g_fields = group_fields.Split(','); string[] s_fields = sum_fields.Split(','); tb.DefaultView.Sort = group_fields; tb = tb.DefaultView.ToTable(); tb.Columns.Add("rows", typeof(List <DataRow>)); var tb2 = tb.Clone(); DataRow dr = null; for (int i = 0; i < tb.Rows.Count; i++) { DataRow row = tb2.NewRow(); row.ItemArray = tb.Rows[i].ItemArray; int flag = 0; if (i == 0) { flag = 1; } else { int flag2 = 0; foreach (string field in g_fields) { if (dr[field].ToString() != row[field].ToString()) { flag2 = 1; break; } } if (flag2 == 0) { if (sum_fields != "") { foreach (string field in s_fields) { dr[field] = Conv.ToDecimal(dr[field]) + Conv.ToDecimal(row[field]); } } var lst = (List <DataRow>)dr["rows"]; lst.Add(row); } else { flag = 1; } } if (flag == 1) { dr = tb2.NewRow(); var lst = new List <DataRow>(); lst.Add(row); dr["rows"] = lst; foreach (string field in g_fields) { dr[field] = row[field]; } if (sum_fields != "") { foreach (string field in s_fields) { dr[field] = row[field]; } } tb2.Rows.Add(dr); } } return(tb2); }