利用DataTable.Compute等方法和属性做各种统计(某一列的总和sum、不重复的某列记录数distinct)
对应sql语句
select UserID, UserName, UserMoney from Users
从数据库里利用SqlDataAdapter读取出DataSet的方法不写了,这个好简单,写统计的办法
using (DataTable dt = ds.Tables[0])
{
//三个变量分别记录总记录数、不重复的用户数、所有用户的金额总额
int rowsCount, distinctUserRowsCount, AllUserMoney;
rowsCount = dt.Rows.Count;
distinctUserRowsCount = dt.DefaultView.ToTable(true, new string[1] { "UserName" }).Rows.Count;
AllUserMoney = Convert.ToDecimal(dt.Compute("sum(UserMoney)", ""));
}
用DataView的ToTable方法统计不好的地方在不能带条件,如果要带条件,还要对这个结果集用Select方法过虑数据,再计算不重复的数据,比如统计UserID<10的用户数:
using (DataTable dtDistinct = new DataTable())
{
//添加两个列
dtDistinct.Columns.Add(new DataColumn("UserID", dt.Columns["UserID"].DataType));
dtDistinct.Columns.Add(new DataColumn("UserName", dt.Columns["UserName"].DataType));
//把符合条件的数据加入dtDistinct准备用于计算
foreach (DataRow dr in dt.Select("UserID<10"))
{
dtDistinct.Rows.Add(new object[] { Convert.ToInt32(dr["UserID"]), dr["UserName"].ToString() });
}
//计算不重复的数据
countUserName = dtDistinct.DefaultView.ToTable(true, new string[] { "UserName" }).Rows.Count;
}
也可以把DataTable中的各行排序后,用循环来统计不重复记录数的:
string lastUserName = "";
foreach (DataRow dr in dt.Select("", "UserName"))
{
if (!lastUserName.Equals(dr["UserName"].ToString()))
{
distinctUserRowsCount++;
lastUserName = dr["UserName"].ToString();
}
}