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

  • 查询以获取流行ID列表
  • 对每个项目进行子查询以从另一个表获取属性

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

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

也许可以构建一个大型SQL查询来一次性完成所有操作,但我更希望将其分隔开。 是否推荐编写一种VB函数以对每一行执行子查询的方法? 谢谢你的帮助。

===============>>#1 票数:2 已采纳

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

===============>>#2 票数: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

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


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

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

所以我想它真的可以归结为查询需要返回什么的细节。


从08年8月21日在22:07更新:
要回答您问题的其他部分-VB函数是否可行? 不,绝对不会。 不是为了这么简单。

函数的性能很差,返回集中的每一行都执行该函数。

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

===============>>#3 票数: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我想在您给出的示例中,您会发现外部联接的性能要优于相关子查询。 请记住,需要为每一行运行子查询。

  ask by Kalid translate from so

未解决问题?本站智能推荐: