【问题标题】:How to get the sum of columns in an SQL table?如何获取 SQL 表中列的总和?
【发布时间】:2017-09-18 16:06:29
【问题描述】:

我正在尝试在我的 SQL 表中添加一个页脚行,该行显示从 DataTable 复制后每列的总和,但我一直得到 -1 的值,而不是此处显示的 Total 值,然后通过将某些列除以计算的总和来获得百分比,我的代码如下。

提前致谢!

        using (SqlConnection dbConnection = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\evxaf4\Documents\Data.mdf;Integrated Security=True;Connect Timeout=30"))
        {
            dbConnection.Open();

            // create table if not exists 
            string createTableQuery = @"Create Table [DesignQuantitiesTable] 
                    ( ElementType varchar(200) , GrossVol real, NetVol real, GrossArea real, NetArea real, percgrosvol real, percnetvol real)";
            SqlCommand command = new SqlCommand(createTableQuery, dbConnection);
            command.ExecuteNonQuery();


            // Copy the DataTable to SQL Server Table using SqlBulkCopy

            using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
            {
                s.DestinationTableName = "dbo.DesignQuantitiesTable";
                //foreach (var column in m_elementInformation.Columns)
                //    s.ColumnMappings.Add(column.ToString(), column.ToString());
                s.WriteToServer(m_elementInformation);
            }

            SqlCommand sumgvol = new SqlCommand("SELECT SUM(GrossVol) FROM DesignQuantitiesTable", dbConnection);
            double sumgrosvol = sumgvol.ExecuteNonQuery();

            SqlCommand sumnvol = new SqlCommand("SELECT SUM(NetVol) FROM  DesignQuantitiesTable", dbConnection);
            double sumnetvol = sumnvol.ExecuteNonQuery();


            SqlCommand sumgarea = new SqlCommand("SELECT SUM(GrossArea) FROM  DesignQuantitiesTable", dbConnection);
            double sumgrosarea = sumgarea.ExecuteNonQuery();

            SqlCommand sumnarea = new SqlCommand("SELECT SUM(NetArea) FROM  DesignQuantitiesTable", dbConnection);
            double sumnetarea = sumnarea.ExecuteNonQuery();


            SqlCommand sumrow = new SqlCommand("Insert into DesignQuantitiesTable ( ElementType, GrossVol, NetVol, GrossArea, NetArea) values ('"+ "Total" +"',"+ sumgrosvol.ToString() +","+ sumnetvol.ToString()+","+ sumgrosarea.ToString() +","+ sumnetarea.ToString() +")", dbConnection);
            sumrow.ExecuteNonQuery();

            SqlCommand percentgvol = new SqlCommand("UPDATE DesignQuantitiesTable SET percgrosvol=(" + "GrossVol/sumgrosvol" + ")"  , dbConnection);
            percentgvol.ExecuteNonQuery();

            SqlCommand percentnvol = new SqlCommand("UPDATE DesignQuantitiesTable SET percnetvol=(" + "NetVol/sumgrosvol" + ")", dbConnection);
            percentnvol.ExecuteNonQuery();


            dbConnection.Close();

        }

【问题讨论】:

  • 你从哪里得到-1?如果在大容量复制后您的表中有任何数据,您是否直接在数据库中检查。
  • 您是否能够验证您通过批量复制插入的数据实际上是否在要选择的表中?在没有代码的情况下,直接对数据库运行 select sum(...) sql 会得到什么?
  • 是的,我通过检查数据库获得了表中的所有数据,但未能获得正确的总和值(查看附图)!
  • 没明白你的意思@TylerLee
  • 到目前为止你尝试过什么?此信息对任何回答您的问题的人都有用!

标签: c# sql datatable


【解决方案1】:

通过使用 ExecuteNonQuery 方法,您不会得到您正在查询的列的总和 - 这会返回受非查询命令影响的列数 - 例如更新和插入。您的查询不会影响任何列,因此可能会返回 -1。 (见ExecuteNonQuery returns -1)。

当您想要返回单个值时,您应该使用 ExecuteScalarQuery (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar(v=vs.110).aspx) - 这将返回一个需要转换的对象(在这里可以进行强制转换)为正确的结果类型。

试试这个:

SqlCommand sumnvol = new SqlCommand("SELECT SUM(NetVol) FROM  DesignQuantitiesTable", dbConnection);
double sumnetvol = (double)sumnvol.ExecuteScalarQuery();

等

【讨论】:

    猜你喜欢
    • 2015-05-07
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2016-09-24
    • 1970-01-01
    • 2015-02-21
    • 2013-02-03
    相关资源
    最近更新 更多