2008年12月17日水曜日

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

DataTableから重複を除くには

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

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

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

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


  1.     Dim dtOriginal As New DataTable  
  2. dtOriginal.Columns.Add("Field1"GetType(String))  
  3. dtOriginal.Columns.Add("Field2"GetType(String))  
  4. dtOriginal.Columns.Add("Field3"GetType(Integer))  
  5.   
  6. dtOriginal.Rows.Add(New Object() {"りんご""青森", 100})  
  7. dtOriginal.Rows.Add(New Object() {"りんご""青森", 100})  
  8. dtOriginal.Rows.Add(New Object() {"みかん""愛媛", 100})  
  9. dtOriginal.Rows.Add(New Object() {"みかん""和歌山", 100})  
  10. dtOriginal.Rows.Add(New Object() {"みかん""和歌山", 100})  
  11. dtOriginal.Rows.Add(New Object() {"メロン""北海道", 100})  
  12.   
  13. Dim viw As New DataView(dtOriginal)  
  14. Dim isDistinct As Boolean = True  
  15. Dim cols() As String = {"Field1""Field2"}  
  16. Dim dtFilter As DataTable = viw.ToTable(isDistinct, cols)  
  17. dtFilter.Columns.Add("Expr"GetType(Integer))  
  18. For Each row As DataRow In dtFilter.Rows  
  19.     Dim expr As String = String.Format("Field1 = '{0}' AND Field2 = '{1}'", row("Field1"), row("Field2"))  
  20.     row("Expr") = dtOriginal.Compute("SUM(Field3)", expr)  
  21. Next  
  22.   
  23.   
  24. For Each row As DataRow In dtFilter.Rows  
  25.     Console.WriteLine("Field1={0}, Field2={1}, Expr={2}", row.Item("Field1").ToString, row.Item("Field2").ToString, row.Item("Expr").ToString)  
  26. Next  

1 件のコメント:

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

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