是否可以在C#DataColumn.Expression中使用SUM中的IIF?

时间:2012-07-05 20:30:16

标签: c# datatable sum iif

这是我试图评估的表达方式:

Sum(IIF(QUALITY<=9.0,1.0,0.0))

问题在于

string expr = "Sum(IIF(QUALITY<=9.0,1.0,0.0))";
dataTable.Compute(expr, "")

抛出错误说

Syntax error in aggregate argument: Expecting a single column argument with possible 'Child' qualifier.


主要的挑战是我不能手动重写表达式,因为它是从RDL文件的字符串中来到我的程序,所以它最初看起来像

Sum(IIF(Fields!QUALITY.Value<=9.0,1.0,0.0))

我的程序需要自动将其转换为一个字符串,该字符串在传递给dataTable.Compute()时将是一个有效的表达式。我根据微软的Compute方法文档确定C#不喜欢“Fields!”或者语法的“.Value”部分,通过删除它们,我有更简单的表达式工作正常;例如,这些语句都返回预期值:

dataTable.Compute("Sum(QUALITY)");
dataTable.Compute("Count(QUALITY)");


有可能做我想做的事吗?我觉得我应该只需要在某处稍微改变一下它的语法,但是我无法在互联网上找到答案而且它变得非常令人沮丧。

以下是我迄今为止尝试过的一些事情,但无济于事:

Sum(IIF([QUALITY]<=9.0,1.0,0.0))
Sum(Convert(IIF(QUALITY<=9.0,1.0,0.0), 'System.Double'))
Sum(IIF(Convert(QUALITY, 'System.Double')<=9.0,1.0,0.0))    

2 个答案:

答案 0 :(得分:4)

执行此操作的一种方法可能是将汇总列添加到DataTable,并将表达式设置为IIF(QUALITY<=9.0,1.0,0.0)

dataTable.Columns.Add("AggregateColumn", typeof(double), "IIF(QUALITY<=9.0,1.0,0.0)");

然后对汇总列求和或计算。

答案 1 :(得分:2)

如果IIF(condition, value1, value2)为真,则

value1会返回condition,否则会返回value2。因此,您的原始语句会计算值为&lt; = 9的所有Quality字段的数量。您可以使用包含filter参数的重载来实现此目的。

dataTable.Compute("Count(QUALITY)","QUALITY <= 9");

MSDN documentation

编辑:错过了第一轮的动态要求。

发生错误是因为IIF使其成为两列操作,而Compute不允许在聚合函数中进行两列操作。这意味着Compute("IIF(Quality <= 9, 1, 0)")有效,但Compute("Sum(IIF(Quality <= 9, 1, 0))")不是。您可以使用IIF(Quality <= 9, Quality, SomeOtherColumn)而不是文字作为IIF的后两个参数,并且似乎解析器不知道差异。

您可以使用Joe的解决方案,或添加更多字符串处理以分离出coniditionals并将它们移动到filter参数。 Joe的答案比尝试重新实现Compute中幕后发生的字符串解析更为明智。