【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