データテーブルの行データを残したまま集計する方法

データテーブルの集計方法について
上記のトピックを参考に集計を行いたいのですが、グルーピングのキーと集計列しか残りません。
下図のように、他の列をそのまま残すにはどうしたら良いですか?
キーとなるのは「コード」、集計は「税別金額」、「消費税」、「税込金額」をそれぞれになります。

※集計前
before
※集計後
after

Hi @111860

Can you try the below

DT.AsEnumerable().
    GroupBy(Function(row) row.Field(Of String)("Name")).
    Select(Function(grp) DT.Clone().LoadDataRow({
        grp.Key,
        grp.Sum(Function(row) row.Field(Of Double)("Amount1")),
        grp.Sum(Function(row) row.Field(Of Double)("Amount2")),
        grp.Sum(Function(row) row.Field(Of Double)("Amount3")),
        grp.First().Field(Of Double)("ID"),
        grp.First().Field(Of String)("Description")
    }, False)).
    CopyToDataTable()

Input:

Output:

Cheers!!

このあたりは、まずは要件を明確にする必要があります。
グルーピングしたキーはそのグループ内では一意ですが、それ以外の項目は一意であるのか、ないのか、あるいは一意でないのであれば、どれを残すのか(最初の行、最後の行等)または結合させるのか
このあたりの内容に応じて式を構築する必要があります。

上記の例の場合、備考が一律ですが、実際にはグループ内でも異なるのであれば、結果の仕様明確化が必要になります。

ありがとうございます。

一意でないのであれば、どれを残すのか(最初の行、最後の行等)または結合させるのか

同一のコードで商品名が異なるケースもありますが、最初の行を残したいと思います。
その他項目も、金額にあたる列以外は同様の対応になります。

よろしくお願いいたします。

I get an error

Unable to cast object of type 'System.Double' to type 'System.String'.

Thank you.

そうであれば例えば以下お試しください。

dt.AsEnumerable.GroupBy(Function(r) r("コード").ToString).Select(Function(g) dt.Clone.LoadDataRow({g.First().Item("商品名").ToString,g.Sum(Function(r) CDec(r("税別金額"))),g.Sum(Function(r) CDec(r("消費税"))),g.Sum(Function(r) CDec(r("税込金額"))),g.Key,g.First().Item("備考").ToString},False)).CopyToDataTable()

サンプル
Sample20240314-4.zip (8.9 KB)

ありがとうございます。こちらでやりたいことが実現できました。

1 Like

数値変換でエラーとなっていますので、計算が必要な列に空白があると思います。
取り急ぎ以下の式をお試しください。

dt.AsEnumerable.GroupBy(Function(r) r("コード").ToString).Select(Function(g) dt.Clone.LoadDataRow({g.First().Item("商品名").ToString,g.Where(Function(r) Decimal.TryParse(r("税別金額").ToString,New Decimal)).Sum(Function(r) CDec(r("税別金額"))),g.Where(Function(r) Decimal.TryParse(r("消費税").ToString,New Decimal)).Sum(Function(r) CDec(r("消費税"))),g.Where(Function(r) Decimal.TryParse(r("税込金額").ToString,New Decimal)).Sum(Function(r) CDec(r("税込金額"))),g.Key,g.First().Item("備考").ToString},False)).CopyToDataTable()
1 Like

不要な行が含まれていたためでした。失礼いたしました。

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.