3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(.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で特定の列の値を集計する