【问题标题】:Joining datasets in SSRS在 SSRS 中加入数据集
【发布时间】:2016-10-14 20:59:30
【问题描述】:

我在 SSRS 中有两个数据集。我想将他们加入一份报告。

第一个是以productnumber为key和builddate的产品列表。

productnumber builddate
123           6/1/2005 
123           6/1/2015 

第二个是具有有效日期的辅助标识符。

表格如下所示:

productnumber secondarynumber effectivedate obsoletedate
123           999             1/1/2000      12/31/2009
123           999A            1/1/2010      1/1/2030

我希望报告如下所示:

productnumber builddate secondarynumber
123           6/1/2005  999
123           6/1/2015  999A

这可能吗?我尝试使用 Lookup 和 LookupSet 返回辅助编号,但我不知道如何传递过滤器参数或如何使用记录集输出。我觉得我错过了什么。

【问题讨论】:

  • 你试过这个=Lookup(Fields!productnumber.Value,Fields!productnumber.Value,Fields!secondarynumber.Value,"Table2DataSet")吗?
  • secondarynumber 的返回取决于您的查找中未包含的构建日期。如果我使用 LookupSet,我会得到两条记录,每个构建日期都有一条。那时我只有辅助编号,没有构建日期。
  • 查找返回找到的第一个值,因此在您的情况下,它将为两行返回999 作为secondarynumber。如何关联第二个数据集中的 builddate 以获得对应的 secondarynumber?
  • 大声笑...这就是我要问的:-)
  • 我的错误。我想这可以从问题中收集到。

标签: reporting-services ssrs-2012


【解决方案1】:

T-SQL 解决方案(如果您的数据源是数据库并且您不限于使用不可修改的存储过程,则最简单)

如果您的数据源是数据库,您可以通过 T-SQL 查询轻松处理它,方法是在两个表之间执行 JOIN 并指定 WHERE 子句以仅选择符合条件的行:有效日期

SELECT a.Productnumber, 
       a.Builddate, 
       b.Secondarynumber 
FROM   Dataset1table a 
       INNER JOIN Dataset2table b 
               ON a.Productnumber = b.Productnumber 
WHERE  a.Builddate BETWEEN b.Effectivedate AND b.Obsoletedate  

SSRS 解决方案:

在代码选项卡下转到Report菜单/Report properties...添加以下VB函数。

Public Function GetSecondaryNumber(buildDate As Date ,
effectiveDate As Object, obsoleteDate As Object, secondaryNumber As Object) As String

Dim i As Integer    

For i = 0  To effectiveDate.Length -1 
  if buildDate >= effectiveDate(i) and buildDate <= obsoleteDate(i) then
     Return secondaryNumber(i)
   End If
Next 

Return ""

End Function

然后在 tablix 的 secondarynumber 列中使用:

=Code.GetSecondaryNumber(
Fields!builddate.Value,
LookupSet(Fields!productnumber.Value,Fields!productnumber.Value,Fields!effectivedate.Value,"DataSet2"),
LookupSet(Fields!productnumber.Value,Fields!productnumber.Value,Fields!obsoletedate.Value,"DataSet2"),
LookupSet(Fields!productnumber.Value,Fields!productnumber.Value,Fields!secondarynumber.Value,"DataSet2")
)

如果您在 EffectiveDate 中没有 Null 并且 obsoleteDate 列。否则你将不得不处理 null 在 VB 函数或 SSRS 中进行验证。

如果这有帮助,请告诉我。

【讨论】:

  • 我想这是 OP 解决方案的唯一方法。很好的解释。
  • 感谢您的帮助!我想我可以做 SSRS 解决方案,而且它似乎会起作用。 (我明天试试。)我应该在问题中提出的另一个细节是数据集来自两个不同的数据库。 (DB2/未链接。)在这种情况下是否可以使用 T-SQL?
  • @tzerb,如果每个数据库都在不同的服务器中,并且您可以link 两个服务器,T-SQL 解决方案可以帮助您。否则实施 SSRS 解决方案。
  • @alejandrozuleta 无法链接它们,如果有点冗长,SSRS 解决方案也可以工作。感谢所有的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多