我是SQL Server Reporting Services的新手,并且想知道执行以下操作的最佳方法:
- 查询以获取常用ID列表
- 每个项目的子查询以从另一个表中获取属性
理想情况下,最终报告列如下所示:
[ID] [property1] [property2] [SELECT COUNT(*)
FROM AnotherTable
WHERE ForeignID=ID]
可能有一些方法可以构建一个巨大的SQL查询来一次完成所有这些,但我更愿意将它分开。是否建议使用VB函数来为每行执行子查询?谢谢你的帮助。
答案 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我认为你会发现外连接比你给出的例子中的相关子查询更好。请记住,需要为每一行运行子查询。