【问题标题】:How to sum columns in a dataTable?如何对数据表中的列求和?
【发布时间】:2011-04-08 23:26:59
【问题描述】:

如何获得数据表中所有列的总和?假设我有下表。如何计算“总”行?将总行添加到数据表应该很容易。

         Columns    hits     uniques    sigups, etc...
Rows                  
1                      12         1         23
2                       1         0          5
3                       6         2          9


total                  19          3        37

更新

我结束了这个。这是我唯一可以开始工作的事情。

 For Each col As DataColumn In TotalsTable.Columns    
    If col.DataType.Name = "DateTime" Then
            count = count + 1
                Continue For
        End If

        Dim colTotal As Double = 0
        Dim value As Double

        For Each row As DataRow In TotalsTable.Rows
            If Double.TryParse(row(col), value) Then
                    colTotal += Double.Parse(row(col))
                    End If
        Next

    totalRow(count) = colTotal
        count = count + 1

  Next

【问题讨论】:

    标签: c# vb.net


    【解决方案1】:

    还有一种方法可以使用DataTable.Compute Method 在不使用循环的情况下执行此操作。以下示例来自该页面。可以看到使用的代码很简单。:

    private void ComputeBySalesSalesID(DataSet dataSet)
    {
        // Presumes a DataTable named "Orders" that has a column named "Total."
        DataTable table;
        table = dataSet.Tables["Orders"];
    
        // Declare an object variable. 
        object sumObject;
        sumObject = table.Compute("Sum(Total)", "EmpID = 5");
    }
    

    我必须补充一点,如果你不需要过滤结果,你总是可以传递一个空字符串:

    sumObject = table.Compute("Sum(Total)", "")
    

    【讨论】:

    • +1 这应该是正确的答案。这是这个问题真正要问的框架的确切功能。
    【解决方案2】:

    试试这个:

                DataTable dt = new DataTable();
                int sum = 0;
                foreach (DataRow dr in dt.Rows)
                {
                    foreach (DataColumn dc in dt.Columns)
                    {
                        sum += (int)dr[dc];
                    }
                } 
    

    【讨论】:

    • 终于从你那里得到了我想要的答案。非常感谢
    【解决方案3】:

    我怀疑这是你想要的,但你的问题有点含糊

    Dim totalCount As Int32 = DataTable1.Columns.Count * DataTable1.Rows.Count
    

    如果您的所有列都是数字列,您可能想要这样:

    您可以使用DataTable.ComputeSum 列中的所有值。

     Dim totalCount As Double
     For Each col As DataColumn In DataTable1.Columns
         totalCount += Double.Parse(DataTable1.Compute(String.Format("SUM({0})", col.ColumnName), Nothing).ToString)
     Next
    

    在您编辑问题并添加更多信息后,这应该可以工作:

     Dim totalRow = DataTable1.NewRow
     For Each col As DataColumn In DataTable1.Columns
         totalRow(col.ColumnName) = Double.Parse(DataTable1.Compute("SUM(" & col.ColumnName & ")", Nothing).ToString)
     Next
     DataTable1.Rows.Add(totalRow)
    

    【讨论】:

    • 对不起。我想对数据表中的所有列求和。
    • @chobo:添加了另一种方法来对所有列的所有行求和。
    • 因此,使用您的技术,您可以计算列的总和,并考虑所有行?
    • @choco: 是的,带有聚合函数Sum 的Datatable.Compute 将计算一列的所有行,如果你愿意,你甚至可以指定一个过滤器。我遍历所有列。
    • @choco:在您提供更多信息后编辑了我的答案。
    【解决方案4】:

    您可以遍历 DataTable 中的 DataColumn 和 DataRow 集合:

    // Sum rows.
    foreach (DataRow row in dt.Rows) {
        int rowTotal = 0;
        foreach (DataColumn col in row.Table.Columns) {
            Console.WriteLine(row[col]);
            rowTotal += Int32.Parse(row[col].ToString());
        }
        Console.WriteLine("row total: {0}", rowTotal);
    }
    // Sum columns.
    foreach (DataColumn col in dt.Columns) {
        int colTotal = 0;
        foreach (DataRow row in col.Table.Rows) {
            Console.WriteLine(row[col]);
            colTotal += Int32.Parse(row[col].ToString());
        }
        Console.WriteLine("column total: {0}", colTotal);
    }
    

    注意:上面的代码在将对象转换为 int 之前没有进行任何类型的检查。

    编辑:添加显示列总和的 DataRow

    试试这个创建一个新行来显示你的列总和:

    DataRow totalsRow = dt.NewRow();
    foreach (DataColumn col in dt.Columns) {
        int colTotal = 0;
        foreach (DataRow row in col.Table.Rows) {
            colTotal += Int32.Parse(row[col].ToString());
        }
        totalsRow[col.ColumnName] = colTotal;
    }
    dt.Rows.Add(totalsRow);
    

    如果您的任何 DataTable 的 DataRows 的数据类型是非数字的,或者您想在求和时检查每个单元格的值,则此方法很好。否则我相信@Tim 使用DataTable.Compute 的响应会更好。

    【讨论】:

    • 有没有一种简单的方法可以将总计分配给该数据表的新行?
    • @chobo 我更新了显示如何添加显示列总和的 DataRow。
    【解决方案5】:

    遗憾的是使用 .NET 而不是使用集合和 lambda 来节省您的时间和代码行 这是一个如何工作的例子: 将 yourDataTable 转换为 Enumerable,如果需要,根据“FILTER_ROWS_FIELD”列对其进行过滤,如果需要,按“A_GROUP_BY_FIELD”对数据进行分组。 然后得到计数、总和或任何你想要的。 如果你想要一个没有 grouby 的计数和总和,请不要对数据进行分组

    var groupedData = from b in yourDataTable.AsEnumerable().Where(r=>r.Field<int>("FILTER_ROWS_FIELD").Equals(9999))
                              group b by b.Field<string>("A_GROUP_BY_FIELD") into g
                              select new
                              {
                                  tag = g.Key,
                                  count = g.Count(),
                                  sum = g.Sum(c => c.Field<double>("rvMoney"))
                              };
    

    【讨论】:

    • 我同意。虽然我仍在查看这篇文章,但我很震惊没有立即看到 lambda 解决方案。
    【解决方案6】:
     for (int i=0;i<=dtB.Columns.Count-1;i++)
     {
       array(0, i) = dtB.Compute("SUM([" & dtB.Columns(i).ColumnName & "])", "")                   
     }
    

    【讨论】:

    • 在您的解决方案开始时有一个小解释是个好主意。
    猜你喜欢
    • 2021-12-13
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    相关资源
    最近更新 更多