人気ブログランキング | 話題のタグを見る
(.Net)DataTableで集約(グループ化)をしたい
DataTableのデータをグループ化したかったんですが、ワンタッチでできる方法はないようです。
で、探してると、yan note: .NET DataTableをグループ化し集計するにはにどんぴしゃな方法が載ってました。

一旦 DataTable を DataView に変換して、DataView.ToTableメソッドを使うと重複行を取り除いた DataTable を作成できるようです。
そして、重複行がないDataTableを行単位でループし、DataTable.Computeメソッドを使って集計値を求めるやる方法のようです。


参考先にもサンプルコード載せられていますが、C#に書き直したものを載せておきます。
//DataTable作成
DataTable tblTest = new DataTable("TestTable");
tblTest.Columns.Add(new DataColumn("name"));
tblTest.Columns.Add(new DataColumn("model"));
tblTest.Columns.Add(new DataColumn("price"));
tblTest.Columns["price"].DataType = Type.GetType("System.Int32");
//テストデータ追加
tblTest.Rows.Add(new object[] { "CPU", "Core i5 750", 18000 });
tblTest.Rows.Add(new object[] { "CPU", "Core i7 860", 25000 });
tblTest.Rows.Add(new object[] { "メモリ", "DDR3 2GB*2", 10000 });
tblTest.Rows.Add(new object[] { "メモリ", "DDR2 2GB*2", 8000 });
 
//重複を除去するため DataView を使う
DataView vw = new DataView(tblTest);
//重複除去を第二引数に指定。第三引数で一意とすべき列を指定。(複数列でも可能)
DataTable tblRes = vw.ToTable("DistinctTable",true, new string[] {"name"});
//合計の列を追加
tblRes.Columns.Add("sumPrice");
 
//重複除いたDataTableをループし、元のDataTableから集計値を求める
foreach (DataRow row in tblRes.Rows)
{
row["sumPrice"] = tblTest.Compute("SUM(price)", "name = '" + row["name"] + "'");
}
 
foreach (DataRow row in tblRes.Rows)
{
Console.WriteLine(row["name"] + ":" + row["sumPrice"]);
}

結果はこうなります。

CPU:43000
メモリ:18000



参考:
(.Net)DataTableで特定の列の値を集計する
by jehoshaphat | 2010-06-16 04:23 | .Net開発


<< (OpenOffice)Cal... フィッシングサイトからルートキ... >>