【c#】datatableで特定のカラムの合計値を取得する方法

C#

下記のようなデータがdatatableに格納されていたとして、”Value”列の合計値を算出する方法の紹介です。

合計値を算出するには、下記のコードのようにComputeメソッドを使えば良いです。

//テーブルの作成
System.Data.DataTable Table = new System.Data.DataTable();
Table.Columns.Add("ID", typeof(int));
Table.Columns.Add("Value", typeof(double));
            
Table.Rows.Add(new Object[] { 1, 1.5 });
Table.Rows.Add(new Object[] { 2, 0.5 });
Table.Rows.Add(new Object[] { 3, 2.0 });
Table.Rows.Add(new Object[] { 4, 1.0 });
Table.Rows.Add(new Object[] { 5, 5.0 });

//Computeメソッドの実行
double sum = Convert.ToDouble(Table.Compute("Sum(Value)", null));

Computeメソッドの第一引数に”Sum(Value)”としています。
Sumの中には適宜集計対象のカラム名を入れてください。
上記の結果、変数sumに”Value”カラムの合計(=10.0)が格納されます。

補足
Computeメソッドの第二引数を使えば特定の条件の行の中で集計を行うことも可能です。
詳細は下記ページを参照してみてください。
DataTable.Compute(String, String) メソッド

参考になれば幸いです。

関連ページ;
【c#】datatableで特定のカラムの最大値を取得する方法

追記:集計対象の行が見つからない場合の対策

下記のようにComputeメソッドの第二引数を使って集計する行を絞ったうえでValueの合計を取得するようなケース等で、集計対象の行が見つからなかった場合はComputeメソッドの戻り値はDBNullとなります。

//テーブルの作成
System.Data.DataTable Table = new System.Data.DataTable();
Table.Columns.Add("ID", typeof(int));
Table.Columns.Add("Value", typeof(double));

Table.Rows.Add(new Object[] { 1, 1.5 });
Table.Rows.Add(new Object[] { 2, 0.5 });
Table.Rows.Add(new Object[] { 3, 2.0 });
Table.Rows.Add(new Object[] { 4, 1.0 });
Table.Rows.Add(new Object[] { 5, 5.0 });

//Computeメソッドの実行
double sum = Convert.ToDouble(Table.Compute("Sum(Value)", "ID = 0"));

Console.WriteLine(sum);

Console.Read();

この場合、そのまま実行すると次のようなエラーが発生します。

ID=0の行はないので集計結果がDBNullになるためエラーが発生

このようなケースが想定される場合は、下記のように三項演算子などを使って条件分岐すればいいと思います。

//テーブルの作成
System.Data.DataTable Table = new System.Data.DataTable();
Table.Columns.Add("ID", typeof(int));
Table.Columns.Add("Value", typeof(double));

Table.Rows.Add(new Object[] { 1, 1.5 });
Table.Rows.Add(new Object[] { 2, 0.5 });
Table.Rows.Add(new Object[] { 3, 2.0 });
Table.Rows.Add(new Object[] { 4, 1.0 });
Table.Rows.Add(new Object[] { 5, 5.0 });

//Computeメソッドの実行
double sum = Convert.ToDouble((Table.Compute("Sum(Value)", "ID = 0") is DBNull) ? 0 : Table.Compute("Sum(Value)", "ID = 0"));

Console.WriteLine(sum);

Console.Read();
タイトルとURLをコピーしました