【问题标题】:Working with data in a datatable处理数据表中的数据
【发布时间】:2014-04-19 21:44:16
【问题描述】:

我正在使用此代码从 sql 数据库中检索数据

DataTable oeeTable = new DataTable();

oeeTable.Columns.Add("ProductionSystem", typeof(string));
oeeTable.Columns.Add("PartNumber", typeof (string));
oeeTable.Columns.Add("RunRate", typeof (int));
oeeTable.Columns.Add("Doses",typeof(int));
oeeTable.Columns.Add("HoursOfGoodProduct",typeof(double));

DataView view = new DataView(oeeTable);
dataGridView1.DataSource = view;

const string sqlQuery = @"SELECT ProdSysShift.ProdSys, LotShift.PartNumber,PartNumberRunRates.TabletsPerHour, LotShift.Doses
                            FROM LotShift INNER JOIN
                            ProdSysShift ON LotShift.intShiftID = ProdSysShift.intShiftID INNER JOIN
                            PartNumberRunRates ON LotShift.PartNumber = PartNumberRunRates.PartNumber
                            WHERE (ProdSysShift.dtmDate >= '3/3/2014') AND (ProdSysShift.dtmDate <='3/5/2014')
                            ORDER BY ProdSysShift.ProdSys, LotShift.PartNumber";

SqlCommand myCommand = new SqlCommand(sqlQuery,_myConnection);

try
{
    _myConnection.Open();
    SqlDataReader myReader = myCommand.ExecuteReader();
    while (myReader.Read())
    {
        string prodSystem = myReader["ProdSys"].ToString();
        string partNumber = myReader["PartNumber"].ToString();
        int tabletsPerHour = (int)myReader["TabletsPerHour"];
        int doses = (int) myReader["Doses"];
        double hoursOfGood = ((double)doses/tabletsPerHour);
        hoursOfGood = Math.Round(hoursOfGood, 2);

        oeeTable.Rows.Add(prodSystem,partNumber,tabletsPerHour, doses, hoursOfGood);
    }
    _myConnection.Close();
}
catch (Exception e)
{
    MessageBox.Show(e.ToString());
}

输出大致如下所示,数据网格视图中的站点

T193 HT19 172800 109872 0.64 T193 HT19 172800 242644 1.4 T193 HT19 172800 745887 4.32 T193 HT19 172800 843160 4.88 T193 HT19 172800 20777 0.12 T193 HT19 172800 384450 2.22 T193 HT19 172800 0 0 T193 HT19 172800 600020 3.47 T193 HT70A 172800 612618 3.55 T193 HT70A 172800 0 0 T371 MT06 172800 0 0 T371 MT06 172800 0 0 T371 MT06 172800 0 0 T371 MT06 172800 1123025 6.5 T371 MT06 172800 98892 0.57 T371 MT06 172800 1001704 5.8 T371 MT06 172800 136080 0.79

接下来我要做的是将最右列中的值按最左列的不同值分组。因此,所有的 T193 将放在一起并求和。所有的 T371 将放在一起并求和。我不太确定下一步会是什么,或者我是否在第一部分做错了。

【问题讨论】:

  • 是否要保留最左侧和最右侧列之间的所有列?如果是这样,它们应该如何显示在您的新结果中?如果没有,你能用SELECT ProdSysShift.ProdSys, SUM(LotShift.Doses) FROM ... WHERE ... ORDER BY ... GROUP BY LotShift.Doses之类的东西吗?
  • 我需要将第 4 列除以第 3 列才能得到第 5 列。在我使用的示例中,所有第 3 列恰好相同,但有时可能会有所不同基于第 2 列中的项目。
  • 抱歉,我误读了您的查询。 PartNumberRunRates.TabletsPerHourLotShift.Doses 的列类型是什么?
  • TabletsPerHour 和 Doses 是整数。我从这两个创建的列是双的
  • 您使用的是什么 RDBMS? MySQL、SQL Server 等?

标签: c# sql datatable dataset


【解决方案1】:

我最终通过存储的程序弄清楚了我需要做什么。谢谢 DonHoitnott 的想法。我使用了一个使用 select into 语句创建临时表的存储过程。我的一些数学是在那部分完成的。我的其余数学运算是在同一个存储过程中使用来自该临时表的后续选择语句完成的,该临时表也基于生产系统进行分组。使用此存储过程返回的数据,我现在有了 C# 程序所需的结果

【讨论】:

    【解决方案2】:

    创建一个新表。运行两个查询,第一个应该可以让您查询不同的 ProductionSystems。

    新表的第一列:

    Select(row=>row.ProductionSystem).Distinct();
    

    创建一个循环,上面的每个值,

    foreach(var ps in query1above)
        table.Where(row=>row.ProductionSystem == ps).Select(row=>row.HoursofGoodProduction).Sum()
    

    这会给你你的总和。

    将总和和生产系统密钥添加到新表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 2019-09-17
      • 2019-08-06
      • 1970-01-01
      • 2013-04-28
      相关资源
      最近更新 更多