我有一个针对SQL Server 2012编写的查询,以获取人员动态列表并确定他们每天在某些领域花费的时间。当我一次运行一个人的查询时,我会得到很好的结果。但是,如果我在IN子句中传递所有参数,则不仅会得到较少的结果,而且某些值会有所不同,这完全是错误的。
这最终将在SSRS的报表中运行,但是即使直接在SSMS中运行数据也显示相同的行为。
@People
是一个单独的查询,它收集当天实际在该地区的人员的列表。 @Yesterday
和@Today
只是日期的变量。]>
SELECT * FROM (SELECT AdmitType, Time, Person, Door, Direction, CASE WHEN Direction LIKE 'In' AND LEAD(Direction, 1) OVER(ORDER BY Time ASC) LIKE 'Out' THEN DATEDIFF (second, Time, LEAD(Time, 1) OVER(ORDER BY Time ASC)) ELSE NULL END AS 'Duration' FROM ActivityLog WHERE Door IN ('Room1', 'Room2', 'Room3') AND Time BETWEEN @Yesterday AND @Today AND Person IN @People) s1 ORDER BY Person, Door, Time ASC
如果运行上面的查询并以
@People
的值传递('Tom', 'Dick', 'Harry')
参数,那么对于Tom的条目,我将得到类似的信息(为清楚起见,删除了一些列以及多个人和门):
Time Direction Duration ----------------------------- 7:12:04 IN 922 7:27:26 OUT NULL 8:40:37 IN NULL 9:07:04 OUT NULL
但是如果仅使用IN子句中列出的Tom运行查询,则会得到以下正确的信息:
Time Direction Duration ----------------------------- 7:12:04 IN 922 7:27:26 OUT NULL 8:40:37 IN 1587 9:07:04 OUT NULL
我如何解决我的查询,以便它能与选定的每个人(通常大约25个人)一起返回正确的信息,或者采用该参数并一次运行每个人并合并结果?
[我见过一次一次传递一个列表并合并所有结果的查询,但我不知道如何编写这种方式以接受将从SSRS传递的参数输入。
我有一个针对SQL Server 2012编写的查询,以获取人员动态列表并确定他们每天在某些领域花费的时间。当我一次运行一个人的查询时,我会很好...
看来您需要向窗口函数添加PARTITION BY。此刻