データテーブルの集計方法について
上記のトピックを参考に集計を行いたいのですが、グルーピングのキーと集計列しか残りません。
下図のように、他の列をそのまま残すにはどうしたら良いですか?
キーとなるのは「コード」、集計は「税別金額」、「消費税」、「税込金額」をそれぞれになります。
※集計前
※集計後
データテーブルの集計方法について
上記のトピックを参考に集計を行いたいのですが、グルーピングのキーと集計列しか残りません。
下図のように、他の列をそのまま残すにはどうしたら良いですか?
キーとなるのは「コード」、集計は「税別金額」、「消費税」、「税込金額」をそれぞれになります。
※集計前
※集計後
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)
ありがとうございます。こちらでやりたいことが実現できました。
数値変換でエラーとなっていますので、計算が必要な列に空白があると思います。
取り急ぎ以下の式をお試しください。
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()
不要な行が含まれていたためでした。失礼いたしました。
This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.