在最初为客户手动编写多个报表作为 MVC 3 (EF4) 项目的一部分后,我决定在 Microsoft 报表服务(SQL Server 2008 上的 SSRS 2008)中编写报表要容易得多。对于我的大多数报告,这已被证明是轻而易举的事,甚至不必为我的大多数报告编写 SQL 过程(基于模型的 BIDS 中的语义查询)。
然而,由于其输入参数的性质以及最初是在返回列表而不是 LINQ 查询的函数中计算的,一份报告仍然令人生畏。目标是返回 people 表中在日期 a 和日期 b 之间的任何一天(由报告请求者输入的变量)内的所有忙于 x% 的人。此忙碌级别信息仅存在于 Job 表中,该表包含有关分配给哪个人员、作业的开始和结束日期以及任务级别的信息。结果,我原来的 C# 函数做了以下事情(伪代码):
given startDateRange a, stopDateRange b, busyLevel x
{
for each person in people:
List returnPeople = new List()
create array consisting of days from a to b
for each job in jobs:
for each intersecting date of DateRange and job dateRange:
add task level of job to array
for each day in array:
if array[day] < x
returnPeople.Add(person)
break;
return returnPeople
}
相关部分的表结构:
People Table:
-PersonID (PK)
-other stuff...
Jobs Table:
-JobID (PK)
-StartDate
-StopDate
-Allocation
-AssignedPersonID (FK to People Table)
如您所见,如果该作业的 AssignedPersonID 为 = 那某人,则该作业在某人的日程表中
所以......因为我现在在 SSRS 2008 工作,我正在寻找有关如何从相同的输入参数在 SSRS 中获得这些相同结果的指导。一些我目前不知道的语义查询技巧?带有临时表或表变量的 SQL 存储过程?某种数据处理扩展?任何有关解决此类问题的最佳方法的信息将不胜感激。
让我知道是否需要其他信息/代码。
编辑:目前正在使用几乎复制我原始函数结构的游标和临时表的解决方案。但是由于游标的复杂性和低效性,这绝对不是理想的,因此建议/替代方案会有所帮助。
编辑:找到了一个解决方案,绝对不是最有效的。如果有人有更快的方法,将改变接受的答案。