【问题标题】:sum up data from Access to DataTable将 Access 中的数据汇总到 DataTable
【发布时间】:2016-08-31 21:00:52
【问题描述】:

我有一个包含 3 个定义类型的列和一个包含数字的列的数据库。 这些类型可以在数据库中多次出现。 我想创建一个 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();
            }

此代码使类型出现多次。

【问题讨论】:

  • 为什么不用SUM函数?
  • "SELECT sum([Expense]) FROM [" + table+"] where [Type]="+type

标签: c# winforms ms-access datatable


【解决方案1】:

您可以使用此代码创建包含按总和分组的每种类型的 DataTable:

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

如果您想在 1 个 DataTable 中汇总来自不同表的类型,请使用:

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

dtAllTypeDataTable 包含按经验总和分组的类型

【讨论】:

  • 谢谢!以及如何将不同表中的类型汇总在一起?
  • 如何在查询中得到变量table
  • 我有一个方法可以返回文件中的表名列表 - List tableList = serviceMethod.getTableList();
  • 你想把表的所有记录放在一个DataTable中?
  • 是的,没错。对所有表中的所有类型进行分组和汇总
猜你喜欢
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 2016-01-01
  • 2012-02-28
  • 2011-07-09
  • 1970-01-01
相关资源
最近更新 更多