【C#】データテーブルにフィルターをかけ、集計値を取得する【DataTable】
目次
フィルターをかけ、集計値を取得する(条件なし)
「dt.Compute(式, 条件)」を使用して、集計値を取得します。
第一引数の式には、Sum(列名)、Count、MAX、MINなどを指定します。
第二引数の条件には、絞り込むための条件を指定します。
全件を対象とする場合は、空文字を指定することで全件が対象となります。
// データテーブルの初期化
DataTable dt = new DataTable();
// データテーブルの名前を指定
dt.TableName = "FRUIT";
// 列追加
dt.Columns.Add("HINMEI");
dt.Columns.Add("SURYO");
dt.Columns.Add("TANKA");
dt.Columns.Add("KINGAKU", typeof(decimal));
// 行追加
dt.Rows.Add("りんご", "3", "50", "150");
dt.Rows.Add("ぶどう", "1", "200", "200");
dt.Rows.Add("みかん", "10", "30", "300");
/*
今回の内容はここから
*/
// フィルターをかけ、集計値を取得する(条件なし)
object obj = dt.Compute("Sum(KINGAKU)", "");
Console.WriteLine(obj);
// ログ出力内容
// 650
フィルターをかけ、集計値を取得する(条件あり)
条件を付け加えて集計値を取得していきます。
データ型を指定しないと数値として扱ってくれないので、SURYO(数量)に int 型を指定しました。
// データテーブルの初期化
DataTable dt = new DataTable();
// データテーブルの名前を指定
dt.TableName = "FRUIT";
// 列追加
dt.Columns.Add("HINMEI");
dt.Columns.Add("SURYO", typeof(int));
dt.Columns.Add("TANKA");
dt.Columns.Add("KINGAKU", typeof(decimal));
// 行追加
dt.Rows.Add("りんご", "3", "50", "150");
dt.Rows.Add("ぶどう", "1", "200", "200");
dt.Rows.Add("みかん", "10", "30", "300");
/*
今回の内容はここから
*/
// フィルターをかけ、集計値を取得する(条件あり)
object obj = dt.Compute("Count(KINGAKU)", "SURYO>2");
Console.WriteLine(obj);
// ログ出力内容
// 2
// フィルターをかけ、集計値を取得する(条件あり+平均)
obj = dt.Compute("AVG(SURYO)", "KINGAKU>100");
Console.WriteLine(obj);
// ログ出力内容
// 4
コピペですぐ試せるソースコード
上記で記載した2点のソースコードをまとめました。
ソースコードをコピペするとそれぞれの動作が確認できると思います。
private void DataTable_Compute()
{
DataTable dt = new DataTable();
// データテーブルの名前を指定
dt.TableName = "FRUIT";
// 列追加
dt.Columns.Add("HINMEI");
dt.Columns.Add("SURYO", typeof(int));
dt.Columns.Add("TANKA");
dt.Columns.Add("KINGAKU", typeof(decimal));
// 行追加
dt.Rows.Add("りんご", "3", "50", "150");
dt.Rows.Add("ぶどう", "1", "200", "200");
dt.Rows.Add("みかん", "10", "30", "300");
/*
今回の内容はここから
*/
// フィルターをかけ、集計値を取得する(条件なし)
object obj = dt.Compute("Sum(KINGAKU)", "");
Console.WriteLine(obj);
// ログ出力内容
// 650
// フィルターをかけ、集計値を取得する(条件あり)
obj = dt.Compute("Count(KINGAKU)", "SURYO>2");
Console.WriteLine(obj);
// ログ出力内容
// 2
// フィルターをかけ、集計値を取得する(条件あり+平均)
obj = dt.Compute("AVG(SURYO)", "KINGAKU>100");
Console.WriteLine(obj);
// ログ出力内容
// 4
}
まとめ
これまでは集計するために、わざわざループ処理を実装していた覚えがあります。
dt.Selectはフィルターのみで、集計はできないので、
集計したい場合は、Computeを使うと便利で無駄な処理がないのでいいですね。
Microsoft 公式ページ
DataTable.Compute(String, String) メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datatable.compute?view=netframework-4.0
お問い合わせ先
Twitterの利用再開しましたのでお問い合わせのある方はTwitterまでご連絡ください。
最近のコメント