2008年12月17日水曜日

.NET DataTableをグループ化し集計するには

DataTableから重複を除くには

DataTableの集約計算を行う(Compute)
を利用して、DataTableをグループ化し集計を行います。

以下のようなデータが入ったDataTableから、Field1とField2で重複を取り除き集計をおこないます。

Field1Field2Field3
りんご青森100
りんご青森100
みかん愛媛100
みかん和歌山100
みかん和歌山100
メロン北海道100

重複を取り除いて集計した結果は以下のデータになります。
Field1Field2Expr
りんご青森200
みかん愛媛100
みかん和歌山200
メロン北海道100


    Dim dtOriginal As New DataTable
dtOriginal.Columns.Add("Field1", GetType(String))
dtOriginal.Columns.Add("Field2", GetType(String))
dtOriginal.Columns.Add("Field3", GetType(Integer))

dtOriginal.Rows.Add(New Object() {"りんご", "青森", 100})
dtOriginal.Rows.Add(New Object() {"りんご", "青森", 100})
dtOriginal.Rows.Add(New Object() {"みかん", "愛媛", 100})
dtOriginal.Rows.Add(New Object() {"みかん", "和歌山", 100})
dtOriginal.Rows.Add(New Object() {"みかん", "和歌山", 100})
dtOriginal.Rows.Add(New Object() {"メロン", "北海道", 100})

Dim viw As New DataView(dtOriginal)
Dim isDistinct As Boolean = True
Dim cols() As String = {"Field1", "Field2"}
Dim dtFilter As DataTable = viw.ToTable(isDistinct, cols)
dtFilter.Columns.Add("Expr", GetType(Integer))
For Each row As DataRow In dtFilter.Rows
    Dim expr As String = String.Format("Field1 = '{0}' AND Field2 = '{1}'", row("Field1"), row("Field2"))
    row("Expr") = dtOriginal.Compute("SUM(Field3)", expr)
Next


For Each row As DataRow In dtFilter.Rows
    Console.WriteLine("Field1={0}, Field2={1}, Expr={2}", row.Item("Field1").ToString, row.Item("Field2").ToString, row.Item("Expr").ToString)
Next

1 件のコメント:

くまえ さんのコメント...

ありがとうございます。大変参考になりました。