Sql SSRS对包含特定值的特定字段的行进行计数

Sql SSRS对包含特定值的特定字段的行进行计数,sql,visual-studio,reporting-services,Sql,Visual Studio,Reporting Services,我正在编写SSRS报告。我有一个包含多个字段的数据集,其中一个字段是Doc_Type。单据类型可以包含多个值,其中一个是“发货” 在我的报告中,我想计算等于“装运”的单据类型的数量。这是我正在使用的,但它不起作用: =CountRows(Fields!Doc_Type.Value = "Shipments") 我得到的错误是:“textrun'Doc_Type.段落[0]的值表达式。TextRuns[0]'的范围参数对聚合函数无效。范围参数必须设置为字符串常量,该常量等于包含组的名称、包含数据

我正在编写SSRS报告。我有一个包含多个字段的数据集,其中一个字段是Doc_Type。单据类型可以包含多个值,其中一个是“发货”

在我的报告中,我想计算等于“装运”的单据类型的数量。这是我正在使用的,但它不起作用:

=CountRows(Fields!Doc_Type.Value = "Shipments")

我得到的错误是:“textrun'Doc_Type.段落[0]的值表达式。TextRuns[0]'的范围参数对聚合函数无效。范围参数必须设置为字符串常量,该常量等于包含组的名称、包含数据区域的名称或数据集的名称。

实现此目的的方法有很多

方法1

你可以这样设置你的表达式

=SUM(IIf(Fields!Doc_Type.Value = "Shipments", 1, 0), "YourDataSetName")
记住SSRS区分大小写,所以请正确输入数据集名称和字段名称

方法2

更喜欢用SQL处理它,因为我想把业务逻辑排除在RDL之外

您可以使用窗口函数获取装运计数

另外请注意,在count的情况下,我没有添加
ELSE 0
条件。因为这将给出错误的结果。count不关心其中的值是什么。它只计算所有非空值。
ELSE Null
将起作用

SELECT Column1, Column2, Column3,
       SUM(CASE WHEN Doc_Type = 'Shipments' THEN 1 ELSE 0 END) OVER() ShipmentCount_UsingSum
       COUNT(CASE WHEN Doc_Type = 'Shipments' THEN 1 END) OVER() ShipmentCount_UsingCount
FROM myTable
JOIN....
WHERE .....

现在,您可以在报告中使用此字段。

您需要使用IIF对字段求值并对结果求和。如果您的表达式位于表中,则可以使用以下内容:

=SUM(IIF(Fields!Doc_Type.Value = "Shipments", 1, 0))

只是好奇你的答案和我的有什么不同?@AnupAgrawal-我认为唯一的区别是我的答案应该用在一个表中,而你的答案可以用在一个自由文本框中,因为它包含数据集。-显式数据集的解决方案在表和自由文本框中都有效。如果数据集没有定义,那么它需要e当前作用域数据集。这意味着数据集名称是隐式的,在我的例子中是显式的。@AnupAgrawal-我没有说它不正确。如果不需要,我不想指定数据集。你在我之前回答了吗?我添加我的数据集时没有看到任何答案。