在MS Reporting Services中执行动态子查询的最佳方法?

时间:2008-08-21 19:25:34

标签: sql sql-server reporting-services service reporting

我是SQL Server Reporting Services的新手,并且想知道执行以下操作的最佳方法:

  
      
  • 查询以获取常用ID列表
  •   
  • 每个项目的子查询以从另一个表中获取属性
  •   

理想情况下,最终报告列如下所示:

[ID] [property1] [property2] [SELECT COUNT(*)
                              FROM AnotherTable 
                              WHERE ForeignID=ID]

可能有一些方法可以构建一个巨大的SQL查询来一次完成所有这些,但我更愿意将它分开。是否建议使用VB函数来为每行执行子查询?谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

我建议使用SubReport。您可以将SubReport放在表格单元格中。

答案 1 :(得分:0)

最简单的方法是:

select *,
 (select count(*) from tbl2 t2 where t2.tbl1ID = t1.tbl1ID) as cnt
from tbl1 t1

这是一个可行的版本(使用表变量):

declare @tbl1 table
(
 tbl1ID int,
 prop1 varchar(1),
 prop2 varchar(2)
)

declare @tbl2 table
(
 tbl2ID int,
 tbl1ID int
)

select *,
 (select count(*) from @tbl2 t2 where t2.tbl1ID = t1.tbl1ID) as cnt
from @tbl1 t1

显然,这只是一个原始示例 - 标准规则适用于不选择*等等......


从2008年8月21日21:27更新:
@AlexCuse - 是的,完全同意表现。

我开始用外连接编写它,但后来在他的示例输出中看到了计数并认为这是他想要的,如果表是外部连接的,则计数将无法正确返回。更不用说连接可以使你的记录成倍增加(来自tbl1的1个条目,匹配tbl2中的2个条目= 2个返回),这可能是无意的。

所以我想这真的归结为你的查询需要返回的细节。


从2008年8月21日22:07更新:
要回答你问题的其他部分 - VB函数是要走的路吗?不,绝对不是。不是为了这么简单。

函数在性能上非常差,返回集中的每一行都执行函数。

如果要“划分”查询的不同部分,则必须更接近于存储过程。构建临时表,执行部分查询并将结果插入表中,然后执行所需的任何进一步查询并更新原始临时表(或插入更多临时表)。

答案 2 :(得分:0)

根据您希望输出的显示方式,子报表可以执行,或者您可以对ID,property1,property2进行分组,并将其他表中的项目显示为详细信息项(假设您要显示的不仅仅是计数)

这样的东西
select t1.ID, t1.property1, t1.property2, t2.somecol, t2.someothercol
from table t1 left join anothertable t2 on t1.ID = t2.ID

@Carlton Jenke我认为你会发现外连接比你给出的例子中的相关子查询更好。请记住,需要为每一行运行子查询。