【问题标题】:Invalid usage of aggregate function Sum() and Type: String聚合函数 Sum() 和类型的使用无效:字符串
【发布时间】:2013-06-06 06:30:28
【问题描述】:

我有一个数据表和一个包含 int 值的列。我没有指定任何数据类型的列。当我执行以下操作时。

object sum = dttest.Compute("sum(Value)", "");

我遇到了错误。

聚合函数 Sum() 和类型:String 的使用无效。

我尝试将列值转换为 int 使用

object sum = dttest.Compute("sum(Convert(Value, 'System.Int32'))","");

我又遇到了另一个错误

聚合参数中的语法错误:需要单个列参数 带有可能的 'Child' 限定符。

当我为列指定数据类型时,第一个代码将返回正确的值。但就我而言,我无法指定列数据类型。有谁有解决办法吗?

【问题讨论】:

    标签: c# datatable


    【解决方案1】:

    您可以使用 LINQ to Datatable:

     var result = dttest.AsEnumerable()
                        .Sum(x => Convert.ToInt32(x["Value"]));
    

    例如如何Sum 获取特定名称:

     var result = dttest.AsEnumerable()
                        .Where(r => r.Field<string>("Name") == "FilterName")
                        .Sum(x => Convert.ToInt32(x["Value"]));
    

    【讨论】:

    • 谢谢,得到结果。我可以在这里执行任何记录过滤过程吗?我不想对所有记录执行 sum()。
    • @XavierDennis:是的,你可以使用Where
    • @XavierDennis:更新了我的答案
    【解决方案2】:

    试试

    object sum = dttest.Compute("Sum(Value)", "[Value] IS NOT NULL");
    

    示例代码

        static DataTable GetTable()
        {
            DataTable table = new DataTable();
            table.Columns.Add("Value", typeof(int));
            table.Columns.Add("Name", typeof(string));
            table.Rows.Add(null, "a");
            table.Rows.Add(50, "a");
            table.Rows.Add(10, "a");
            table.Rows.Add(21, "b");
            table.Rows.Add(100, "b");
            return table;
        }
        static void Main(string[] args)
        {
            DataTable dt =GetTable();
            var str = dt.Compute("Sum(Value)", "Name='a' and Value is not null");
        }
    

    你不能用 Convert 来调用 Sum,但你可以在下面尝试

    DataTable dt =GetTable();
    dt.Columns.Add("temp", typeof(int), "Convert(Value, 'System.Int32')");
    var str = dt.Compute("Sum(temp)", "Name='a' and Value is not null");
    

    【讨论】:

    • 仍然出现相同的转换错误。表中的所有值都是int类型。
    • @XavierDennis 检查我更新的答案,它在 Compute 上运行良好,没有错误。
    • 但问题是,我没有指定列的数据类型。数据表是从 sql 查询中填充的。从 sql 查询返回的列将填充到数据表中。
    • 您能否更新一下您如何从数据库中获取数据以及 db 中Value 的列类型是什么?
    【解决方案3】:

    试试

    dttest.Compute("Sum(Convert([Value], 'System.Int32'))","[Value] IS NOT NULL");
    

    【讨论】:

    • 我收到构建错误“方法 'Compute' 没有重载需要 1 个参数”
    【解决方案4】:

    当程序尝试对声明为字符串的数据表列求和时,会发生此错误。
    使用以下代码对字符串列进行计算操作。

    dtTable.Compute("Sum(Convert(" + col_Name + ", 'System.Int32')",""); 
    

    【讨论】:

    • 根据您填充 DataTable 的方式,您应该能够将数据库列类型更改为 int、decimal 等。我收到此错误,我无意中将列创建为 varchar( )。将其更改为 int() 并且错误消失了。是的,不是每个人都有权对数据库进行更改,但如果你这样做了,这可能比将字符串转换为求和更好。
    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 2020-08-30
    • 2013-10-07
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2019-11-03
    相关资源
    最近更新 更多