2016-05-05 7 views
0

Ich habe eine Datenbank, die eine Spalte von 3 definierten Typen und eine Spalte enthält, die Zahlen enthält. Die Typen können mehrere Male in der Datenbank erscheinen. Ich möchte eine DataTable erstellen, die jeden Typ nur einmal anzeigt und zu Zahlen zusammenfasst, die sich auf diesen Typ beziehen.summieren Daten von Zugriff auf DataTable

  List<String> types = typesInTable(table); 
      DataTable t = new DataTable(); 
      t.Clear(); 
      t.Columns.Add("Type"); 
      t.Columns.Add("Total Expenses"); 

      foreach (String type in types) 
      { 
       DataRow tmp = t.NewRow(); 
       tmp["Type"] = type; 
       int total = 0; 
       myConnection.Open(); 
       OleDbDataReader reader = null; 
       OleDbCommand cmd = new OleDbCommand("SELECT [Type] , [Expense] FROM [" + table+"]", myConnection); 
       reader = cmd.ExecuteReader(); 
       while (reader.Read()) 
       { 
        if(reader["Type"].ToString().Equals(type)) 
        { 
         total += Convert.ToInt32(reader["Expense"].ToString()); 
        } 
       } 

       tmp["Total Expenses"] = total; 
       if (!t.Rows.Contains(tmp)) 
       { 
        t.Rows.Add(tmp); 
       } 
       myConnection.Close(); 
      } 

Mit diesem Code werden die Typen mehrmals angezeigt.

+1

, warum Sie nicht die Funktion SUMME verwenden? –

+1

"SELECT Summe ([Aufwand]) FROM [" + Tabelle + "] wo [Typ] =" + Typ –

Antwort

0

können Sie diesen Code verwenden Datatable zu erstellen, die jede Art enthält mit der Summe gruppiert:

DataTable t = new DataTable(); 
myConnection.Open(); 
string query = string.Format("SELECT Type, Sum(Expense) AS TotalExpenses FROM [{0}] group by Type", table); 
OleDbCommand cmd = new OleDbCommand(query, myConnection); 
OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); 
adapter.Fill(t); 
myConnection.Close(); 

wenn Sie möchten die Typen aus verschiedenen Tabellen fassen alle zusammen in 1 Table Verwendung dieses:

List<String> tableList = serviceMethod.getTableList(); 
DataTable dtAllType = new DataTable(); 
foreach (string table in tableList) 
{ 
    DataTable dtTemp = new DataTable(); 
    myConnection.Open(); 
    string query = string.Format("SELECT Type, Sum(Expense) AS TotalExpenses FROM [{0}] group by Type", table); 
    OleDbCommand cmd = new OleDbCommand(query, myConnection); 
    OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); 
    adapter.Fill(dtTemp); 

    for (int i = 0; i < dtTemp.Rows.Count; i++) 
    { 
     bool isDupe = false; 
     for (int j = 0; j < dtAllType.Rows.Count; j++) 
     { 
      if (dtTemp.Rows[i][0].ToString() == dtAllType.Rows[j][0].ToString()) 
      { 
       dtAllType.Rows[j][1] = int.Parse(dtAllType.Rows[j][1].ToString()) + int.Parse(dtTemp.Rows[i][1].ToString()); 
       isDupe = true; 
       break; 
      } 
     } 

     if (!isDupe) 
     { 
      dtAllType.ImportRow(dtTemp.Rows[i]); 
     } 
    } 
    myConnection.Close(); 
} 

die dtAllTypeDataTable Typ enthalten mit Summe von Expence gruppiert

+0

Vielen Dank! und wie kann ich die Typen aus verschiedenen Tabellen zusammenfassen? –

+0

Sie können den Code als Antwort auf eine Schleife Tabellen setzen. –

+0

Wie erhalten Sie die Variable 'table' in Query? –