数据表:使用小计添加计算列

时间:2014-08-21 09:46:01

标签: vb.net datatable

我通过查询大型mysql数据库生成了一个数据表。 这导致了大约7000行。现在我想添加一个列,用于计算“BREAK2”列中每个唯一值的“QUANTITY”列的总和(如'group by')。

示例:

BREAK2 | QUANTITY | COMPUTED

A          10         30
B          20         40
A          10         30
A          20         30
B          20         40

如果我使用

Dim dc As DataColumn = New DataColumn
dc.DataType = System.Type.GetType("System.Double")
dc.ColumnName = "SumQTY"
dt.Columns.Add(dc)

For Each dr As DataRow In DT.Rows
    dr("SumQTY") = DT.Compute("Sum(QUANTITY)", "BREAK2 = '" & dr("BREAK2") & "'")
Next

这需要很长时间(在我将其分解前几分钟)。

当我使用名为BRIO的querytool查询相同数据时,我添加了一个公式为“Sum(QUANTITY,BREAK2)”的计算列,得到结果大约需要1秒。

这些方法之间可能有什么区别?
为什么VB.net代码需要这么长时间? 我曾尝试使用LINQ但性能相同。

感谢。 NAS

1 个答案:

答案 0 :(得分:0)

这似乎很快

Sub Main
    Dim sw = new Stopwatch()
    sw.Start()
    Dim rnd = new Random()
    Dim dt = new DataTable()
    dt.Columns.Add("BREAK2", "".GetType())
    dt.Columns.Add("QUANTITY", 0.GetType())
    dt.Columns.Add("COMPUTED", 0.GetType())
    for i = 0 to 7000
        dt.Rows.Add("A", rnd.Next(0, 30))
        dt.Rows.Add("B", rnd.Next(0, 30))
        dt.Rows.Add("C", rnd.Next(0, 30))
        dt.Rows.Add("D", rnd.Next(0, 30))
    Next

    Dim keys As List(Of String) = dt.AsEnumerable() _ 
                                  .Select(Function(x) x("BREAK2").ToString()) _ 
                                  .Distinct().ToList()
    For Each k in keys
        Dim listOfRow = dt.AsEnumerable() _ 
                        .Where(Function(x) x.Field(Of String)("BREAK2") = k).ToList()

        Dim total = listOfRow.Sum(Function(t) t.Field(Of Integer)("QUANTITY"))
        For Each row in listOfRow
           row.SetField(Of Integer)("COMPUTED", total)
        Next
    Next
    sw.Stop()
    Console.WriteLine(sw.ElapsedMilliseconds)
End Sub

正如我在上面的评论中所说,重新计算数千次的相同价值是愚蠢的。
使用LINQ,您可以提取列BREAK2的唯一值,对键所标识的行子集执行一次总和,然后使用总计设置相同的行子集。
在我的电脑上,这需要最多100毫秒。