处理数据表中的数据

时间:2014-03-14 14:24:24

标签: c# sql datatable dataset

我正在使用此代码从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都将在一起并总结。我不太确定下一步会是什么,或者我是否错误地解决了第一部分。

2 个答案:

答案 0 :(得分:2)

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

新表的第一栏:

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

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

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

这将为您提供总和。

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

答案 1 :(得分:0)

我最终弄明白了我需要通过存储的程序做什么。谢谢DonHoitnott的想法。我使用了一个存储过程,使用select into语句创建临时表。我的一些数学工作在那部分完成。我使用来自该临时表的后续select语句在同一存储过程中完成剩余的数学运算,该临时表也基于生产系统进行分组。使用这个存储的被监视的数据所恢复的数据现在我得到了我的C#程序所需的结果