1

I have a DataTable I would like massage into a new format (here is what it comes out like when attached to a gridview):

 <table cellspacing="0" rules="all" border="1" id="GridView1" style="border-collapse: collapse;">
        <tr>
            <th scope="col">
                Line
            </th>
            <th scope="col">
                StartTime
            </th>
            <th scope="col">
                EndTime
            </th>
            <th scope="col">
                Attribute
            </th>
            <th scope="col">
                Value
            </th>
        </tr>
        <tr>
            <td>
                Line1
            </td>
            <td>
                24/01/2013 7:30:10 AM
            </td>
            <td>
                24/01/2013 8:00:10 AM
            </td>
            <td>
                Actual
            </td>
            <td>
                0
            </td>
        </tr>
        <tr>
            <td>
                Line1
            </td>
            <td>
                24/01/2013 7:30:10 AM
            </td>
            <td>
                24/01/2013 8:00:10 AM
            </td>
            <td>
                ProductCategory
            </td>
            <td>
                FFAC
            </td>
        </tr>
        <tr>
            <td>
                Line1
            </td>
            <td>
                24/01/2013 7:30:10 AM
            </td>
            <td>
                24/01/2013 8:00:10 AM
            </td>
            <td>
                Target
            </td>
            <td>
                36.5
            </td>
        </tr>
        <tr>
            <td>
                Line2
            </td>
            <td>
                24/01/2013 7:26:50 AM
            </td>
            <td>
                24/01/2013 8:00:10 AM
            </td>
            <td>
                Actual
            </td>
            <td>
                69
            </td>
        </tr>
        <tr>
            <td>
                Line2
            </td>
            <td>
                24/01/2013 7:26:50 AM
            </td>
            <td>
                24/01/2013 8:00:10 AM
            </td>
            <td>
                ProductCategory
            </td>
            <td>
                FFAC
            </td>
        </tr>
        <tr>
            <td>
                Line2
            </td>
            <td>
                24/01/2013 7:26:50 AM
            </td>
            <td>
                24/01/2013 8:00:10 AM
            </td>
            <td>
                Target
            </td>
            <td>
                55.5555582046509
            </td>
        </tr>
        <tr>
            <td>
                Line3
            </td>
            <td>
                24/01/2013 8:00:20 AM
            </td>
            <td>
                24/01/2013 8:47:50 AM
            </td>
            <td>
                Actual
            </td>
            <td>
                1475
            </td>
        </tr>
        <tr>
            <td>
                Line3
            </td>
            <td>
                24/01/2013 8:00:20 AM
            </td>
            <td>
                24/01/2013 8:47:50 AM
            </td>
            <td>
                ProductCategory
            </td>
            <td>
                FFAC
            </td>
        </tr>
        <tr>
            <td>
                Line3
            </td>
            <td>
                24/01/2013 8:00:20 AM
            </td>
            <td>
                24/01/2013 8:47:50 AM
            </td>
            <td>
                Target
            </td>
            <td>
                202.430557310581
            </td>
        </tr>
        <tr>
            <td>
                Line4
            </td>
            <td>
                24/01/2013 7:31:30 AM
            </td>
            <td>
                24/01/2013 8:00:10 AM
            </td>
            <td>
                Actual
            </td>
            <td>
                1384
            </td>
        </tr>
        <tr>
            <td>
                Line4
            </td>
            <td>
                24/01/2013 7:31:30 AM
            </td>
            <td>
                24/01/2013 8:00:10 AM
            </td>
            <td>
                ProductCategory
            </td>
            <td>
                FFAC
            </td>
        </tr>
        <tr>
            <td>
                Line4
            </td>
            <td>
                24/01/2013 7:31:30 AM
            </td>
            <td>
                24/01/2013 8:00:10 AM
            </td>
            <td>
                Target
            </td>
            <td>
                3179.26381587982
            </td>
        </tr>
        <tr>
            <td>
                Line5
            </td>
            <td>
                24/01/2013 7:37:00 AM
            </td>
            <td>
                24/01/2013 8:00:10 AM
            </td>
            <td>
                Actual
            </td>
            <td>
                0
            </td>
        </tr>
        <tr>
            <td>
                Line5
            </td>
            <td>
                24/01/2013 7:37:00 AM
            </td>
            <td>
                24/01/2013 8:00:10 AM
            </td>
            <td>
                ProductCategory
            </td>
            <td>
                FHHT
            </td>
        </tr>
        <tr>
            <td>
                Line5
            </td>
            <td>
                24/01/2013 7:37:00 AM
            </td>
            <td>
                24/01/2013 8:00:10 AM
            </td>
            <td>
                Target
            </td>
            <td>
                92.6652171770756
            </td>
        </tr>
        <tr>
            <td>
                P2_Bundler
            </td>
            <td>
                24/01/2013 7:35:00 AM
            </td>
            <td>
                24/01/2013 8:00:10 AM
            </td>
            <td>
                Actual
            </td>
            <td>
                7
            </td>
        </tr>
    </table>

I know that if the records have the same line, start and end times, the records are related.

What I want to do is get a sum of the Actual and Target values grouped by the ProductCategory. In other words:

ProductCategory | Sum(Actual) | Sum(Target)

FFAC            | 1000        | 2000

FHHT            | 200         | 175

Any guidance would be appreciated!

Regards,

Chris

4

2 に答える 2

2

ここではマッサージはありません;)

dataTable の構造はグリッド コードよりも便利ですが、DataTable から必要なものを取得するには、そのようなことを行う必要があります。

var result = myDataTable.AsEnumerable()
              .GroupBy(m => m.Field<string>("ProductCategory"))
              .Select(g => new {
                  productCategory = g.Key,
                  sumActual = g.Sum(x => x.Field<decimal>("Actual")),
                  sumTarget = g.Sum(x => x.Field<decimal>("Target"))
               });
于 2013-01-24T15:34:55.540 に答える
0

おーい、これは予想以上に難しいと思っていたのですが、簡単だったので書き直しました。行に対してグループ化を実行しますが、各グループの行を照会して ProductCategory を取得する必要があります。

まず、メイン キーでグループ化します。この場合はLine列だと思います。そう:

myDataTable.AsEnumerable()
    .GroupBy(m => m.Field<string>("Line"))

次に、これらの各グループのカテゴリを見つける必要があります。各グループ化は であるため、 asをフィルタリングIEnumerable<T>した後に a を実行し、最初の値を取得します。属性が存在しない状況を考慮して、少し「防御的な」コーディングを使用します。SelectAttributeProductCategoryProductCategory

    ...
    .Select(g => new 
        { 
            ProductCategory = g.Where(r => r.Field<string>("Attribute") == "ProductCategory")
                        .Select(r => r.Field<string>("Value"))
                        .FirstOrDefault() ?? "No Category",
            SumActual = g.Sum(x => x.Field<decimal>("Actual")),
            SumTarget = g.Sum(x => x.Field<decimal>("Target"))
        })

編集:さて、あなたの言っていることがわかりました。元の各グループ (Line に基づく) をさらに別のグループにグループ化するという点で、私の最初の考えは正しかったです。簡単な方法はありませんし、オプションもきれいではありません。各グループをグループ化する必要があるのは事実ですが、グループをグループ化するには、単一のエンティティのグループをクエリしてから、別の 2 つのエンティティに基づいて集計する必要があります (ここで LINQ を使用することは非常に困難です)。

myDataTable.AsEnumerable()
    .GroupBy(m => m.Field<string>("Line"))
    .Select(g => new
        {
            ProductCategory = g.Where(r => r.Field<string>("Attribute") == "ProductCategory")
                        .Select(r => r.Field<string>("Value"))
                        .FirstOrDefault() ?? "No Category",
            Actual = g.Where(r => r.Field<string>("Attribute") == "Actual")
                        .Select(r => 
                            { 
                                decimal d = 0m; 
                                Decimal.TryParse(r.Field<string>("Value"), out d);
                                return d;
                            }
                        .FirstOrDefault(),
            Target = g.Where(r => r.Field<string>("Attribute") == "Target")
                        .Select(r => 
                            { 
                                decimal d = 0m; 
                                Decimal.TryParse(r.Field<string>("Value"), out d);
                                return d;
                            }
                        .FirstOrDefault()
        })
    .GroupBy(n => n.ProductCategory)
    .Select(g => new
        {
            ProductCategory = g.Key,
            SumActual = g.Sum(x => x.Actual),
            SumTarget = g.Sum(x => x.Target)
        })

繰り返しますが、あまりきれいではありません...特に、「値」列は文字列であるため、意味のある値を取得するには、それらを解析する必要があります (この場合、数値を合計します)。ここでの前提は、すべてのレコードを「ブロック」にグループ化し、これらのブロックを単一の匿名オブジェクトに構成することです。したがって、各匿名オブジェクトは、特定の Line のすべてのデータ行の属性/値のペアを表します。そこから、目的のキー (この場合は ProductCategory) に基づいてグループ化し、必要な集計を実行します。

PS、実際には PIVOT を使用して DB 側でこのクエリを実行します。もう少しセットアップが必要かもしれませんが、このタイプのデータ処理/集計を実行するように設計されたシステムに処理可能な作業を与え、フロントエンドの CPU サイクルをより重要なことに使用し続けます。

于 2013-01-24T19:00:39.533 に答える