来自第二列不同的列的总和值?

背后的故事


我正在为我们的工程师制作一个表格,旨在“自动化”我们的物料清单生成。 我们有一个名为AutoAttibute(由Cadig使用)的程序,用于获取每个选定“块”的值并将其输出到excel文件。 没有select将其输出到任何其他格式(SQL,Access等)。

由AutoAttribute生成的表的基本布局如下所示:

Material | Total Length Weight -------------------------------- name1 | 34 name1 | 34 name2 | 34 name2 | 34 name3 | 34 name3 | 34 name4 | 33 name4 | 33 name5 | 1254 name6 | 324 

还有其他列生成,但这些是我需要关注的。

一旦这个文件被创build,我们一直在使用MS Access来获取第二列的值的总和。

这是查询:

我没有确切的查询,但基本上是这样的:

 Select Distinct [Material], [Total Length Weight] from `table` where [Material] <> '' 

哪给了我:

  Material | Total Length Weight -------------------------------- name1 | 34 name2 | 34 name3 | 34 name4 | 33 name5 | 1254 name6 | 324 

然后,在一个单独的查询中:

 Select Sum [Total Length Weight] From Query 1 

哪给了我:

  Sum([Total Length Weight]) ---------------------------- 1713 

然后,我们可以使用该值来做其他事情,比如在另一个公式中显示项目总权重的variables。

新问题


我正在使用C#创build一个全新的表单,而且我在重新创build查询时遇到了问题。

我正在使用连接string:

 string file = "D:\\Cut-Lengths\\13-1311 CUT-LENGTHS.xlsx"; string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file + ";Extended Properties=Excel 12.0"; 

然后,我有以下查询:

 string query = "Select Sum([CUT-LENGTH-WEIGHT]) AS [SumOfCUT-LENGTH-WEIGHT], Sum([TOTAL-SHEETING-WEIGHT]) AS [SumOfTOTAL-SHEETING-WEIGHT], Sum([TOTAL-ITEM-WEIGHT]) AS [SumOfTOTAL-ITEM-WEIGHT] From [Sheet1$]"; string query2 = "Select COUNT([Total-Length-Weight]) AS `Total Length Weight` From [Sheet1$]"; string query3 = "Select DISTINCT [Total-Length-Weight] AS `Total Length Weight`, [Material] AS `Material`, [Order] From [Sheet1$] WHERE [Material] <> '' ORDER BY [Order]"; string table = "Select * From [Sheet1$]"; 

我使用这些查询来填充4个dataGridViews,以及窗体上的几个TextBoxes。

query2是非常错误的,我知道。 这就是我试图从Access重新创build查询的地方,但无论我尝试什么,我都无法使其工作。

同样的查询的其他方式我已经尝试:

 string query2 = "Select Sum(DISTINCT [Total-Length-Weight]) AS `Total Length Weight` From [Sheet1$]"; string query2 = "Select DISTINCT [material], Sum([Total-Length-Weight]) AS `Total Length Weight` From [Sheet1$]"; 

还有其他的我现在还记不起来。 我知道其中一个涉及一个子查询,甚至从来没有加载的forms。

我真的需要帮助,我只是不知道我做错了什么。

完整的表格代码


 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.OleDb; using System.Xml.Serialization; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml; namespace excelConnectiontests { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void SetFirstRowSelected() { if (gvExcelData.Rows.Count > 0) { var row = gvExcelData.Rows[0]; var row2 = gvExcelData2.Rows[0]; var row3 = gvExcelData3.Rows[0]; var row4 = gvExcelData4.Rows[0]; txtCutLengthWeight.Text = row.Cells[0].Value.ToString(); txtTotalSheetingWeight.Text = row.Cells[1].Value.ToString(); txtTotalItemWeight.Text = row.Cells[2].Value.ToString(); //and so on int value1 = Convert.ToInt32(row.Cells[0].Value); int value2 = Convert.ToInt32(row.Cells[1].Value); int value3 = Convert.ToInt32(row.Cells[2].Value); int value4 = 0; if (txtCutSheetingWeight.Text != "") { value4 = Convert.ToInt32(txtCutSheetingWeight.Text); } else { value4 = 0; } txtNetWeight.Text = (value1 + value2 + value3 + value4).ToString(); gvExcelData.CurrentCell = row.Cells[0]; //set focus to first cell in first row } } private void Form1_Load(object sender, EventArgs e) { string file = "D:\\Cut-Lengths\\13-1311 CUT-LENGTHS.xlsx"; string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file + ";Extended Properties=Excel 12.0"; string CutTubes = ""; string CutSheeting = ""; string UncutTubes = ""; string UncutSheeting = ""; string NonSteel = ""; string p31 = ""; string query = "Select Sum([CUT-LENGTH-WEIGHT]) AS [SumOfCUT-LENGTH-WEIGHT], Sum([TOTAL-SHEETING-WEIGHT]) AS [SumOfTOTAL-SHEETING-WEIGHT], Sum([TOTAL-ITEM-WEIGHT]) AS [SumOfTOTAL-ITEM-WEIGHT] From [Sheet1$]"; string query2 = "Select COUNT([Total-Length-Weight]) AS `Total Length Weight` From [Sheet1$]"; string query3 = "Select DISTINCT [Total-Length-Weight] AS `Total Length Weight`, [Material] AS `Material`, [Order] From [Sheet1$] WHERE [Material] <> '' ORDER BY [Order]"; string table = "Select * From [Sheet1$]"; OleDbConnection connObj = new OleDbConnection(connString); connObj.Open(); // Uncut Steel OleDbCommand cmdObj4 = new OleDbCommand(query3, connObj); OleDbDataAdapter daObj4 = new OleDbDataAdapter(cmdObj4); DataTable dtObj4 = new DataTable(); daObj4.Fill(dtObj4); gvExcelData4.DataSource = dtObj4; // Totals OleDbCommand cmdObj3 = new OleDbCommand(table, connObj); OleDbDataAdapter daObj3 = new OleDbDataAdapter(cmdObj3); DataTable dtObj3 = new DataTable(); daObj3.Fill(dtObj3); gvExcelData3.DataSource = dtObj3; // Length Weight OleDbCommand cmdObj = new OleDbCommand(query, connObj); OleDbDataAdapter daObj = new OleDbDataAdapter(cmdObj); DataTable dtObj = new DataTable(); daObj.Fill(dtObj); gvExcelData.DataSource = dtObj; // Total Length Weight OleDbCommand cmdObj2 = new OleDbCommand(query2, connObj); OleDbDataAdapter daObj2 = new OleDbDataAdapter(cmdObj2); DataTable dtObj2 = new DataTable(); daObj2.Fill(dtObj2); gvExcelData2.DataSource = dtObj2; connObj.Close(); SetFirstRowSelected(); } private void textBox4_TextChanged(object sender, EventArgs e) { SetFirstRowSelected(); } } } 


我想清楚我需要什么:

 string query2 = "SELECT SUM([Total-Length-Weight]) FROM (Select DISTINCT [Material], [Total-Length-Weight] from [Sheet1$])"; 

感谢大家的帮助。

我以前没有使用Excel查询,但语法看起来像T-SQL。 如果是这样的话,我想你正在寻找的是一个group by

 string query2 = "Select [material], Sum([Total-Length-Weight]) AS `Total Length Weight` From [Sheet1$] group by [material]"; 

我认为你可以通过GROUP BY修复查询2。

所以对于查询2:

“select[材料],总和([总长度 – 重量])AS Total Length Weight来自[Sheet1 $] group by [material]”;

每个人都忽略的是,你只想总结不同的值,下面的代码应该这样做:

 Select [material], Sum(DISTINCT [Total-Length-Weight]) AS `Total Length Weight` From [Sheet1$] where [material] <> '' group by [material] 

我想你在这里需要group by ,所以:

 Select [Material], SUM([Total Length Weight]) from `table` group by [Material] having [Material] <> '' 

编辑

如果我们只关心每种材料一个重量,而且我们可以假设所有的参数总是相同的,那么我们可以作弊和使用MINMAX例如:

 SELECT SUM(Weight) FROM (Select [Material], MAX([Total Length Weight]) 'Weight' from `table` group by [Material] having [Material] <> '' ) 

我想到了! 🙂

这是我需要的查询:

 string query2 = "SELECT SUM([Total-Length-Weight]) FROM (Select DISTINCT [Material], [Total-Length-Weight] from [Sheet1$])";