首页 > 解决方案 > 如何从 vb.net 中的 DataTables 构建值的总和?

问题描述

我正在使用 VB.Net 从数据库中检索数据,进行一些计算,然后在 datagridview 中显示这些数据。我已经将数据库中的数据导入到我的软件中的 DataTable 中。到目前为止,一切都很好。

现在,我想将同一行中的另一列具有特定文本的列中的值相加。

这是一个例子。我有以下形式的数据(在 DataTable 中):

日期 // 类型 // 值
2020 年 10 月 9 日 // 值 80 // 92
2020 年 10 月 9 日 // value71 // 5
2020 年 10 月 9 日 // value63 // 2
2020 年 10 月 7 日 // 值 80 // 85
2020 年 10 月 7 日 // value71 // 10
2020 年 10 月 7 日 // value63 // 1

我想构建 3 个type值的总和,其中“value80”、“value71”和“value63”来自同一日期。新变量的value_sum计算应使得 2020 年 9 月 10 日:

value_sum = value80 + value71 + value63 = 92 + 5 + 2 = 99 

2020 年 10 月 7 日:

value_sum = value80 + value71 + value63 = 85+ 10 + 1 = 96

如何计算新值以便将它们保存在另一个 DataTable 中?

标签: vb.netdatatable

解决方案


在 Linq 查询中,我们按日期字段分组并选择日期和总和。请参阅https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/queries/group-by-clause有一个 .CopyToDataTable 方法(https://docs.microsoft.com/en -us/dotnet/api/system.data.datatableextensions.copytodatatable?view=netcore-3.1)但我不知道它是否或如何与匿名类型一起使用。只需遍历查询结果并将行添加到新的 DataTable 就很容易了。

Private Sub OPCode()
    'Create original DataTable with your sample data
    Dim dt As New DataTable
    dt.Columns.Add("ValueDate", GetType(Date))
    dt.Columns.Add("Type", GetType(String))
    dt.Columns.Add("Value", GetType(Integer))
    With dt.Rows
        .Add(#10/09/2020#, "value80", 92)
        .Add(#10/08/2020#, "value71", 5)
        .Add(#10/09/2020#, "value85", 2)
        .Add(#10/07/2020#, "value80", 85)
        .Add(#10/07/2020#, "value71", 10)
        .Add(#10/07/2020#, "value63", 1)
    End With
    'Select the date groups and sum by group
    Dim TotalsByDate = From row In dt.AsEnumerable
                       Group By DateValue = row.Field(Of Date)("ValueDate")
                           Into Dates = Group, Sum(row.Field(Of Integer)("Value"))
                       Select DateValue, Sum
    'Prepare a new DataTable
    Dim dt2 As New DataTable
    dt2.Columns.Add("DateGroup", GetType(Date))
    dt2.Columns.Add("DateSum", GetType(Integer))
    'Fill the new DataTable
    For Each item In TotalsByDate
        dt2.Rows.Add(item.DateValue, item.Sum)
    Next
    'Display results
    DataGridView1.DataSource = dt2
End Sub

推荐阅读