我有一个通过传递多值参数从存储过程创建的数据集。我现在需要检查参数中的所有值是否都返回到我的结果集的特定列中,如果没有,则在报告中显示这些值。
所以,例如,如果我将值'a','b','c'和'd'传递给我的参数,如果我的数据集列只包含'a'和'd',那么我需要一种在报告上显示“b”和“c”的方法。
谢谢, PRATIK
答案 0 :(得分:1)
首先,您需要一个为您的参数提供值的查询。查询可能如下所示:
select 'a' as ParamValue
union all
select 'b' as ParamValue
union all
select 'c' as ParamValue
union all
select 'd' as ParamValue
现在添加一个可以列出参数值的表。
接下来,您可以使用Lookup函数检查主数据集中是否存在每个值:
=IIf(IsNothing(Lookup(Fields!PARAMVALUE.Value,Fields!COLVALUE.Value,Fields!COLVALUE.Value, "MainDataSet")), True, False)
您可以将其用作过滤器,仅显示此函数未返回值的参数值:
答案 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
金额显示结算金额