1. ホーム
  2. linq

[解決済み] LINQを使用してデータをPivotすることは可能ですか?

2022-04-20 02:38:14

質問

LINQを使用して、以下のレイアウトからデータをピボットすることが可能かどうか疑問に思っています。

CustID | OrderDate | Qty
1      | 1/1/2008  | 100
2      | 1/2/2008  | 200
1      | 2/2/2008  | 350
2      | 2/28/2008 | 221
1      | 3/12/2008 | 250
2      | 3/15/2008 | 2150

をこのようなものに変更します。

CustID  | Jan- 2008 | Feb- 2008 | Mar - 2008 |
1       | 100       | 350       |  250
2       | 200       | 221       | 2150

解決方法は?

こんな感じ?

List<CustData> myList = GetCustData();

var query = myList
    .GroupBy(c => c.CustId)
    .Select(g => new {
        CustId = g.Key,
        Jan = g.Where(c => c.OrderDate.Month == 1).Sum(c => c.Qty),
        Feb = g.Where(c => c.OrderDate.Month == 2).Sum(c => c.Qty),
        March = g.Where(c => c.OrderDate.Month == 3).Sum(c => c.Qty)
    });

GroupBy のLinqはSQLと同じようには動きません。 SQLでは、キーと集約を取得します(行/列の形)。 Linqでは、キーとキーの子としての要素(階層型)が取得されます。 ピボットを行うには、階層を任意の行/列の形に投影し直す必要があります。