2

こんにちは、私は次のようにデータテーブルにデータを持っています

SKU  Quantity  UnitPrice  LinePrice
 A     10         2         20
 A     10         2         20
 B     10         2         40

レコードが重複している SKU を合計して、次のような結果を得たいと考えています。

SKU  Quantity  UnitPrice  LinePrice
 A     20         2         40
 B     10         2         40

これを試しましたが、うまくいきませんでした

var query = from row in lDTSalesOrder.AsEnumerable()
                            group row by row.Field<string>("SKU") into grp
                            orderby grp.Key
                            select new
                            {
                                Id = grp.Key,
                                Sum = grp.Sum(r => r.Field<double>("UnitPrice"))
                            };
4

1 に答える 1

4

サンプル出力では、実際には単価を合計していませんが、必要なものは次のようになります。

var results = 
    from row in lDTSalesOrder
    group row by row.Field<string>("SKU") into grp
    orderby grp.Key
    select new
    {
        SKU = grp.Key,
        Quantity = grp.Sum(r => r.Field<double>("Quantity")),
        UnitPrice = grp.Sum(r => r.Field<double>("UnitPrice")),
        LinePrice = grp.Sum(r => r.Field<double>("LinePrice"))
    };

これにより、次が生成されます。

SKU  Quantity  UnitPrice  LinePrice
 A     20         4         40
 B     10         2         40

2最初の結果レコードの単価を本当に生成したいのであれば、それSumはあなたが望むものではありません。他の集計関数を使用する必要があります。MinMaxAverage、またはSelect(...).First()その結果が生成されますが、出力に必要なものをより正確に定義する必要があります。これを行うこともできます:

var results = 
    from row in lDTSalesOrder
    group row by new { SKU = row.Field<string>("SKU"), UnitPrice = row.Field<string>("UnitPrice") } into grp
    orderby grp.Key.SKU
    select new
    {
        SKU = grp.Key.SKU,
        Quantity = grp.Sum(r => r.Field<double>("Quantity")),
        UnitPrice = grp.Key.UnitPrice,
        LinePrice = grp.Sum(r => r.Field<double>("LinePrice"))
    };

これらのオプションのいずれかが生成されます。

SKU  Quantity  UnitPrice  LinePrice
 A     20         2         40
 B     10         2         40
于 2013-05-11T16:22:51.850 に答える