将多值参数中的值与SSRS中的数据集列进行比较

时间:2016-05-16 21:24:48

标签: stored-procedures reporting-services parameters ssrs-2012

我有一个通过传递多值参数从存储过程创建的数据集。我现在需要检查参数中的所有值是否都返回到我的结果集的特定列中,如果没有,则在报告中显示这些值。

所以,例如,如果我将值'a','b','c'和'd'传递给我的参数,如果我的数据集列只包含'a'和'd',那么我需要一种在报告上显示“b”和“c”的方法。

谢谢, PRATIK

2 个答案:

答案 0 :(得分:1)

首先,您需要一个为您的参数提供值的查询。查询可能如下所示:

select 'a' as ParamValue
union all
select 'b' as ParamValue
union all
select 'c' as ParamValue
union all
select 'd' as ParamValue

设置要由此查询填充的参数值: enter image description here

现在添加一个可以列出参数值的表。

enter image description here

接下来,您可以使用Lookup函数检查主数据集中是否存在每个值:

=IIf(IsNothing(Lookup(Fields!PARAMVALUE.Value,Fields!COLVALUE.Value,Fields!COLVALUE.Value, "MainDataSet")), True, False)

您可以将其用作过滤器,仅显示此函数未返回值的参数值:

enter image description here

答案 1 :(得分:0)

您是否可以更改存储过程(或根据旧报告创建一个新过程)?如果是,那么您可以从INNER JOIN更改为OUTER JOIN并获得该结果。例如,如果您的存储过程显示上个月有多少客户收费,并且看起来像:

SELECT ClientName, SUM(BillAmount) AS TotalBilled
FROM Clients
INNER JOIN Bills ON Clients.ClientId = Bills.ClientId AND Bills.BillDate >= DateAdd(m, -1, GetDate())
WHERE ClientId IN @ClientIds
GROUP BY ClientName
ORDER BY ClientName

然后这将排除任何未结算的客户。如果您更改为OUTER JOIN,请执行以下操作:

SELECT ClientName, SUM(BillAmount) AS TotalBilled
FROM Clients
LEFT OUTER JOIN Bills ON Clients.ClientId = Bills.ClientId AND Bills.BillDate >= DateAdd(m, -1, GetDate())
WHERE ClientId IN @ClientIds
GROUP BY ClientName
ORDER BY ClientName

那么没有账单的客户仍然会以Null金额显示结算金额