回答編集履歴
1
VB追記
test
CHANGED
@@ -122,3 +122,94 @@
|
|
122
122
|
```
|
123
123
|
![アプリ画像](https://ddjkaamml8q8x.cloudfront.net/questions/2024-03-29/830a8c78-4fd8-414f-8031-8cb25fbe1fd5.png)
|
124
124
|
下ふたつで順番が違いますが、`DataTable`の追加順はあまり意味はないので問題ないでしょう(実際はIdや作成日等のカラムがあるでしょうから好きにソートすればいい)
|
125
|
+
|
126
|
+
## 追記
|
127
|
+
```vb.net
|
128
|
+
Public Class Form1
|
129
|
+
Public Sub New()
|
130
|
+
InitializeComponent()
|
131
|
+
|
132
|
+
Dim dt = New DataTable
|
133
|
+
dt.Columns.Add("Column0")
|
134
|
+
dt.Columns.Add("Column4", GetType(Decimal))
|
135
|
+
dt.Columns.Add("Column6")
|
136
|
+
dt.Rows.Add("Row0", 10D, "Group1")
|
137
|
+
dt.Rows.Add("Row1", -20D, "Group1")
|
138
|
+
dt.Rows.Add("Row2", 30D, "Group1")
|
139
|
+
dt.Rows.Add("Row3", -100D, "Group2")
|
140
|
+
dt.Rows.Add("Row4", 200D, "Group2")
|
141
|
+
|
142
|
+
|
143
|
+
'現状
|
144
|
+
Dim msms_ms = dt.AsEnumerable _
|
145
|
+
.GroupBy(Function(r) r("Column6").ToString) _
|
146
|
+
.Select(Function(g)
|
147
|
+
Dim row = dt.NewRow
|
148
|
+
row("Column0") = g.First()("Column0").ToString
|
149
|
+
row("Column4") = g.Sum(Function(r) CDec(r("Column4")))
|
150
|
+
row("Column6") = g.First()("Column6").ToString
|
151
|
+
Return row
|
152
|
+
|
153
|
+
'カラムが多いならこれが手っ取り早いかな(何が入っているかにもよるが...
|
154
|
+
'Dim row = dt.NewRow
|
155
|
+
'row.ItemArray = g.First().ItemArray
|
156
|
+
'row("Column4") = g.Sum(Function(r) CDec(r("Column4")))
|
157
|
+
'Return row
|
158
|
+
End Function) _
|
159
|
+
.CopyToDataTable
|
160
|
+
|
161
|
+
|
162
|
+
'負の値を除外して集計後、負の値の行をマージ
|
163
|
+
Dim nururi = dt.AsEnumerable _
|
164
|
+
.Where(Function(r) CDec(r("Column4")) >= 0) _
|
165
|
+
.GroupBy(Function(r) r("Column6").ToString) _
|
166
|
+
.Select(Function(g)
|
167
|
+
Dim row = dt.NewRow
|
168
|
+
row("Column0") = g.First()("Column0").ToString
|
169
|
+
row("Column4") = g.Sum(Function(r) CDec(r("Column4")))
|
170
|
+
row("Column6") = g.First()("Column6").ToString
|
171
|
+
Return row
|
172
|
+
End Function) _
|
173
|
+
.CopyToDataTable
|
174
|
+
Dim minus = dt.AsEnumerable _
|
175
|
+
.Where(Function(r) CDec(r("Column4")) < 0) _
|
176
|
+
.CopyToDataTable
|
177
|
+
nururi.Merge(minus)
|
178
|
+
|
179
|
+
|
180
|
+
'キー細工
|
181
|
+
Dim tn8001 = dt.AsEnumerable _
|
182
|
+
.GroupBy(Function(r)
|
183
|
+
'グループ化するキーを負の値でなければそのまま
|
184
|
+
If 0 < CDec(r("Column4")) Then
|
185
|
+
Return r("Column6").ToString
|
186
|
+
|
187
|
+
Else '負の値だったら何かユニークな値にすれば、別のグループとして扱われる
|
188
|
+
'ちょっと危ないか? ハッシュが衝突するというより、
|
189
|
+
'(わたしは)Column6に何が入ってるか知らないという意味で。
|
190
|
+
'(数字が入っていたらぶつかる可能性もあるかも?と)
|
191
|
+
Return r.GetHashCode.ToString
|
192
|
+
|
193
|
+
'あるいは全カラムを連結するとか?
|
194
|
+
|
195
|
+
'Guidがいいか?
|
196
|
+
'Return Guid.NewGuid.ToString
|
197
|
+
End If
|
198
|
+
End Function) _
|
199
|
+
.Select(Function(g)
|
200
|
+
Dim row = dt.NewRow
|
201
|
+
row("Column0") = g.First()("Column0").ToString
|
202
|
+
row("Column4") = g.Sum(Function(r) CDec(r("Column4")))
|
203
|
+
row("Column6") = g.First()("Column6").ToString
|
204
|
+
Return row
|
205
|
+
End Function) _
|
206
|
+
.CopyToDataTable
|
207
|
+
|
208
|
+
|
209
|
+
DataGridView1.DataSource = dt
|
210
|
+
DataGridView2.DataSource = msms_ms
|
211
|
+
DataGridView3.DataSource = nururi
|
212
|
+
DataGridView4.DataSource = tn8001
|
213
|
+
End Sub
|
214
|
+
End Class
|
215
|
+
```
|