LoginSignup
5
6

More than 5 years have passed since last update.

LINQでクロス集計表の作成

Last updated at Posted at 2015-02-12

データの集計を目的に使われるクロス集計を、DataTableに対するLINQで書いてみます。
EXCELでも簡単にできると思いますが、私はやりたくないです。

やってみよう

DataTableに入っているデータをcolumn1, column2という2軸でクロス集計しています。

var query = from table 
            in dataTable.AsEnumerable()
            group table by new { column1 = table[column1], column2 = table[column2] }
            into groupby
          //orderby hogepiyo
            select new
                {
                     groupby.Key.column1
                    ,groupby.Key.column2
                    ,frequency = groupby.Count()
                };

並び替え

orderby句をLINQの中に入れるとなぜかうまくいかなかったので、
集計結果にメソッド記法でソートを実施

query.OrderBy(x => x.column1).ThenBy(x => x.column2);

//orderby hogepiyoの部分に

orderby groupby.Key.column1.ToString(),groupby.Key.column2.ToString()

と書くと動きそうですがなぜかダメでした。
正しい書き方わかる人いたら教えてください。

追記1

このクエリではgroupby句に引っかかる箇所しかとれないので、厳密にクロス集計表を作るなら引っかからなかった箇所は0で埋める必要があります。

追記2

chocolamintさんにコメントで指摘いただいたのですが、
上記のクエリだと辞書順ソートになってしまいます。
(OrderByメソッドも同様です。ごめんなさい;;)

正しくは、tableへのアクセスで

table.Field<int>(column1)

として数値として取得する必要があります。

var query = from table 
            in dataTable.AsEnumerable()
            group table by new { column1 = table.Field<int>(column1), column2 = table.Field<int>(column2) }
            into groupby
            orderby groupby.Key.column1, groupby.Key.column2
            select new
                {
                     groupby.Key.column1
                    ,groupby.Key.column2
                    ,frequency = groupby.Count()
                };

5
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6