一次通过多个参数迭代一个SQL查询并合并结果

问题描述 投票:0回答:1

我有一个针对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传递的参数输入。

[从Alan Schofield建议添加的其他数据:当我添加PARTITION BY子句时,我现在正在获取先前那些NULL的数据,但这不是正确的数据。

SELECT *
FROM
    (SELECT 
         AdmitType,
         Time,
         Person,
         Door,
         Direction,
         CASE 
            WHEN Direction LIKE 'In' AND LEAD(Direction, 1) OVER(PARTITION BY Person, Door 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

HERE是一个更大的示例数据集,具有新的PARTITION BY子句结果:

Time      Person     Door    Direction    Duration  
18:07:22  John       Room1   IN           1308  (Correct)
18:29:10  John       Room1   Out          NULL  
17:42:18  John       Room3   IN           1406  (Correct)
18:05:44  John       Room3   Out          NULL
7:12:04   Tom        Room1   IN           922   (Correct)
7:27:26   Tom        Room1   Out          NULL
8:40:37   Tom        Room1   IN           2    (Previously NULL, Now 2, should be 1587 and is when queried alone)
9:07:04   Tom        Room1   Out          NULL
9:09:07   Tom        Room1   IN           31   (Previously NULL, Now 31, should be 1256 and is when queried alone)
9:30:03   Tom        Room1   Out          NULL
9:38:48   Tom        Room1   IN           48   (Correct)
9:39:36   Tom        Room1   Out          NULL
9:39:45   Tom        Room1   Out          NULL
9:40:36   Tom        Room1   IN           90   (Correct)
9:42:06   Tom        Room1   Out          NULL
10:25:0   Tom        Room1   IN           47   (Previously 47, Now 47, Should be 8939 and is when queried alone)
12:54:08  Tom        Room1   Out          NULL
14:09:42  Tom        Room1   IN           39   (Correct)
14:10:21  Tom        Room1   Out          NULL
14:39:03  Tom        Room1   IN           1316 (Previously NULL, Now 1316, should be 4178 and is when queried alone)
15:48:41  Tom        Room1   Out          NULL
15:49:20  Tom        Room1   IN           52   (Previously NULL, Now 52, should be 1542 and is when queried alone)
16:15:02  Tom        Room1   Out          NULL
16:22:26  Tom        Room1   IN           292  (Previously 292, Now 292, should be 1504 and is when queried alone)
16:47:30  Tom        Room1   Out          NULL

数据继续大量发送,但希望可以提供更好的主意。

我有一个针对SQL Server 2012编写的查询,以获取人员动态列表并确定他们每天在某些领域花费的时间。当我一次运行一个人的查询时,我会很好...

sql-server reporting-services sql-server-2012 parameter-passing ssrs-2012
1个回答
0
投票

看来您需要向窗口函数添加PARTITION BY。此刻

© www.soinside.com 2019 - 2024. All rights reserved.