web-dev-qa-db-fra.com

Comment additionner des colonnes dans un dataTable?

Comment puis-je obtenir une somme pour toutes les colonnes d'un datatable? Dis que j'ai eu la table suivante. Comment puis-je calculer la ligne "total"? Il devrait être facile d’ajouter le nombre total de lignes à un datatable.

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


total                  19          3        37

Mettre à jour

J'ai fini avec ça. C'était la seule chose que je pouvais faire pour travailler.

 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
15
chobo

Essaye ça:

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

Il existe également un moyen de le faire sans boucle en utilisant la méthode DataTable.Compute . L'exemple suivant provient de cette page. Vous pouvez voir que le code utilisé est assez simple .:

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");
}

Je dois ajouter que si vous n'avez pas besoin de filtrer les résultats, vous pouvez toujours passer une chaîne vide:

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

Je doute que ce soit ce que vous voulez, mais votre question est un peu vague

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

Si toutes vos colonnes sont des colonnes numériques, vous voudrez peut-être ceci:

Vous pouvez utiliser DataTable.Compute to Sum toutes les valeurs de la colonne.

 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

Après avoir modifié votre question et ajouté plus d'informations, cela devrait fonctionner:

 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)
4
Rango

Vous pouvez parcourir les collections DataColumn et DataRow de votre DataTable:

// 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);
}

Attention: le code ci-dessus ne fait aucune sorte de vérification avant de convertir un objet en int.

EDIT: ajouter un DataRow affichant les sommes des colonnes

Essayez ceci pour créer une nouvelle ligne afin d’afficher vos sommes de colonne:

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);

Cette approche convient si le type de données d'un des DataRows de votre DataTable est non numérique ou si vous souhaitez inspecter la valeur de chaque cellule lors de la somme. Sinon, je pense que la réponse de @ Tim en utilisant DataTable.Compute est meilleure.

2
Jay Riggs

C'est dommage d'utiliser .NET et non pas d'utiliser collections et lambda pour économiser votre temps et vos lignes de code Voici un exemple de fonctionnement: Transformez votre DataTable en Enumerable, filtrez-le si vous le souhaitez, en fonction de "FILTER_ROWS_FIELD". "colonne, et si vous voulez, groupez vos données par un" A_GROUP_BY_FIELD ". Ensuite, obtenez le compte, la somme ou ce que vous voulez . Si vous voulez un compte et une somme sans groupe, ne pas grouper les données 

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"))
                          };
1
ealef
 for (int i=0;i<=dtB.Columns.Count-1;i++)
 {
   array(0, i) = dtB.Compute("SUM([" & dtB.Columns(i).ColumnName & "])", "")                   
 }
0
Dy Say