BloggerAds

2011年7月27日 星期三

C#將DataTable做Group By並取SUM、AVG、COUNT的方法(不用LINQ)

LINQ是個很方便的東西,但在比較舊的環境(.Net Framerwork 3.0以下的版本),是沒辦法使用LINQ的,這時要將DataTable做Group By可是很麻煩的一件事,下面就提供範例:
DataTable dt = new DataTable();    //原來的資料
dt = Get(); //取得資料,PS. Get()是我自己寫的Function,要記得換成你取得DataTable的function

//將原來的DataTable做Distinct並複製到新DataTable,ToTable的第一個參數是設定是否
//要做Distinct,當然要設成true,其他參數是要做Group By的欄位名稱
DataTable dtGroup = dt.DefaultView.ToTable(true, "column1", "column2");

//開始加欄位
dtGroup.Columns.Add("CountColumn");
dtGroup.Columns.Add("SumColumn");
dtGroup.Columns.Add("AvgColumn");

int count = 0;

for (int i = 0; i < dtGroup.Rows.Count;i++) {
    //取資料,用String是因為上方加欄位時,沒指定型別為數字
    string strCount = dt.Select("column1='" + dtGroup.Rows[i]["column1"].ToString() + "'").Length.ToString();
    string strSum = dt.Compute("SUM(column3)", "column1='" + dtGroup.Rows[i]["column1"].ToString() + "'").ToString();
    string strAvg = dt.Compute("AVG(column4)", "column1='" + dtGroup.Rows[i]["column1"].ToString() + "'").ToString();

    //設定資料
    dtGroup.Rows[i]["CountColumn"] = (strCount == "" ? "0" : strCount);
    dtGroup.Rows[i]["SumColumn"] = (strSum == "" ? "0" : strSum);
    dtGroup.Rows[i]["AvgColumn"] = (strAvg  == "" ? "0" : strAvg );       
}
最後dtGroup就是Group By後的資料了。

1 則留言: