【问题标题】:Sum Values from column where second column is distinct?第二列不同的列的总和值?
【发布时间】:2014-03-26 13:09:06
【问题描述】:

背景故事


我正在为我们的工程师制作一个表格,旨在“自动化”我们的物料清单生成。我们有一个与 AutoCAD 一起使用的名为 AutoAttibute(由 Cadig 开发)的程序,它获取每个选定“块”的值并将其输出到 excel 文件。没有选项可以将其输出为任何其他格式(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

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

创建此文件后,我们一直在使用 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

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

新问题


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

我正在使用连接字符串:

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 个 dataGridView,以及表单上的几个 TextBox。

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

我尝试过的相同查询的其他方式:

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$]";

还有一些我现在不记得了。我知道其中一个涉及到一个从未加载过表单的子查询。

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

完整格式代码


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$])";

感谢大家的帮助。

【问题讨论】:

    标签: c# sql excel


    【解决方案1】:

    我以前没有使用过 Excel 查询,但语法看起来像 T-SQL。如果是这种情况,我认为您正在寻找的是group by

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

    【讨论】:

      【解决方案2】:

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

      所以对于查询 2:

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

      【讨论】:

        【解决方案3】:

        每个人都忽略了一个事实,即您只想对不同的值求和,下面的代码应该这样做:

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

        【讨论】:

        • 这更像我正在寻找的,但我收到以下错误消息:查询表达式'Sum(DISTINCT [Total-Length-Weight])'中的语法错误(缺少运算符)。
        • 可能是复制/粘贴错误,有时格式会使单引号变成奇怪的引号。检查你去哪里作为“总长度重量”确保那些是单引号而不是奇怪的那个
        • 我很欣赏您的评论,但实际上我想通了。在我的主要帖子中查看我的修改信息。谢谢。
        • 你试过没有“where”和“as”别名吗?只是为了检查?因为我很确定我的代码无需借助派生表就可以工作
        • 到目前为止,我已经尝试了几种代码排列,但总是抛出错误。
        【解决方案4】:

        我认为你需要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] <> '' )
        

        【讨论】:

        • 我试过了,但这给了我每种材料的总和,这不是我想要的...每种材料都有一个重量值,并且对于那种材料来说是相同的(每个重量对于name1 = 33)。如果有两个 name1s 则使用您的方法然后 id 得到 66...这不是我想要的。
        • 如果您可以忽略权重不同的情况,然后将SUM 更改为MINMAX 然后
        • 这仍然适用于材料,而不是整个表。当我尝试它时,我得到 No value given for a or more required parameters。
        【解决方案5】:

        我想通了! :)

        这是我需要的查询:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-17
          • 2020-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-13
          相关资源
          最近更新 更多