
[英]In MS Reporting Services, how do you set a dynamic dataset, based on a selectable Report database parameter
[英]Best way to perform dynamic subquery in MS Reporting Services?
我是SQL Server Reporting Services的新手,并且想知道执行以下操作的最佳方法:
- 查询以获取流行ID列表
- 对每个项目进行子查询以从另一个表获取属性
理想情况下,最终报告列应如下所示:
[ID] [property1] [property2] [SELECT COUNT(*)
FROM AnotherTable
WHERE ForeignID=ID]
也许可以构建一个大型SQL查询来一次性完成所有操作,但我更希望将其分隔开。 是否推荐编写一种VB函数以对每一行执行子查询的方法? 谢谢你的帮助。
我建议使用SubReport 。 您可以将SubReport放在表格单元格中。
最简单的方法是这样的:
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
显然,这只是一个原始示例-适用标准规则,例如不要选择*,等等。
从08年8月21日21:27更新:
@AlexCuse-是的,完全同意表演。
我开始使用外部联接来编写它,但是随后在他的示例输出中看到了计数并认为这是他想要的,如果表是外部联接的,则该计数将无法正确返回。 更不用说联接会导致您的记录成倍增加(tbl1中的1个条目与tbl2中的2个条目相匹配= 2个返回),这可能是意外的。
所以我想它真的可以归结为查询需要返回什么的细节。
从08年8月21日在22:07更新:
要回答您问题的其他部分-VB函数是否可行? 不,绝对不会。 不是为了这么简单。
函数的性能很差,返回集中的每一行都执行该函数。
如果要“分隔”查询的不同部分,则必须更像是存储过程。 构建一个临时表,执行查询的一部分并将结果插入表中,然后执行所需的任何其他查询并更新原始临时表(或插入更多临时表)。
根据您希望输出的外观,可以执行子报表,也可以对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我想在您给出的示例中,您会发现外部联接的性能要优于相关子查询。 请记住,需要为每一行运行子查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.