最近做了几个小小统计的报表界面,由于.net不带group by 的功能,统计起来有时候相当不便,便趁着睡着的时候写了一个类似的方法。 有不足之处或是有更好的方法还望大家指正。 至于效率如何?未知,因为本人的测试数据就是比较少。 /// <summary> /// SQL Group by /// </summary> /// <param name="dtSource">数据源</param> /// <param name="arrType">统计类型:count、sum、avg、max、min</param> /// <param name="arrField">与前面类型一一对应的字段</param> /// <param name="strGroupby">Groupby字段,可以多个,并用逗号隔开</param> /// <returns></returns> public static DataTable DataTableGroupBy(DataTable dtSource, string[] arrType, string[] arrField, string strGroupby) { if (strGroupby == null || strGroupby == string.Empty) { strGroupby = "PublicColumn"; dtSource.Columns.Add(strGroupby);//无条件全局统计 } //创建一个与数据源相同结构的表用于接收统计后的数据 DataTable dt = dtSource.Clone(); //group by(或distinct) 操作过滤掉相同项 DataView dv = dtSource.Copy().DefaultView.ToTable(true, strGroupby).DefaultView; string[] arrRow = strGroupby.Split(','); foreach (DataRowView drv in dv) { strGroupby = string.Empty; DataRow dr = dt.NewRow(); for (int i = 0; i < arrRow.Length; i++) { //过滤条件 strGroupby += arrRow[i] + (drv[arrRow[i]].ToString() == string.Empty ? " is null " : "='" + drv[arrRow[i]] + "'") + " and "; dr[arrRow[i]] = drv[arrRow[i]]; } strGroupby += "1=1"; //对每个字段进行不同方式的统计 for (int i = 0; i < arrType.Length; i++) { dr[arrField[i]] = dtSource.Compute(arrType[i] + "(" + arrField[i] + ")", strGroupby); } dt.Rows.Add(dr); } return dt; }