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