0

试图将单个查询放在一起以最终在 SQL Server 2005 报告中使用。我需要:

  1. 在一段时间内提取“eventid”列中值的所有不同记录 - 这似乎有效。
  2. 对于上面引用的每个 eventid,我需要搜索相同 eventid 的所有实例,以查看是否有另一条带有 TaskName 的记录,例如“review1%”。同样,这似乎有效。
  3. 这就是事情变得复杂的地方:对于 TaskName 类似于 review1 的每条记录,我需要查看是否存在具有相同 eventid 以及 TaskName='End' 的另一条记录。最后,我需要计算有多少条记录有 TaskName 像'review1%',然后有多少条 TaskName 像'review1%' AND TaskName='End'。我认为这可以通过为每条记录设置一个新值来完成,对于 eventid,如果存在 TaskName='End' 的记录,则设置为 1,如果不存在,则设置为 0。

下面的查询似乎完成了上面的第 1 项:

SELECT eventid, TimeStamp, TaskName, filepath
FROM (SELECT eventid, TimeStamp, filepath, TaskName,
ROW_NUMBER() OVER(PARTITION BY eventid
ORDER BY TimeStamp DESC)
AS seq
FROM eventrecords where ((TimeStamp >= '2010-4-1 00:00:00.000') 
and (TimeStamp <= '2010-4-21 00:00:00.000'))) AS T
WHERE seq = 1 order by eventid

下面的查询似乎完成了#2:

SELECT eventid, TimeStamp, TaskName, filepath
FROM (SELECT eventid, TimeStamp, filepath, TaskName,
ROW_NUMBER() OVER(PARTITION BY eventid
ORDER BY TimeStamp DESC)
AS seq
FROM eventrecords where ((TimeStamp >= '2010-4-1 00:00:00.000') 
and (TimeStamp <= '2010-4-21 00:00:00.000')) and TaskName like 'Review1%') AS T
WHERE seq = 1 order by eventid

这将带回也具有 TaskName='End' 的 eventid:

SELECT eventid, TimeStamp, TaskName, filepath
FROM (SELECT eventid, TimeStamp, filepath, TaskName,
ROW_NUMBER() OVER(PARTITION BY eventid
ORDER BY TimeStamp DESC)
AS seq
FROM eventrecords where ((TimeStamp >= '2010-4-1 00:00:00.000') 
and (TimeStamp <= '2010-4-21 00:00:00.000')) and TaskName like 'Review1%') AS T
WHERE seq = 1 
and eventid in 
(Select eventid from 
eventrecords 
where TaskName = 'End')
order by eventid

所以我尝试了以下方法来尝试完成#3:

SELECT eventid, TimeStamp, TaskName, filepath
FROM (SELECT eventid, TimeStamp, filepath, TaskName,
ROW_NUMBER() OVER(PARTITION BY eventid
ORDER BY TimeStamp DESC)
AS seq
FROM eventrecords where ((TimeStamp >= '2010-4-1 00:00:00.000') 
and (TimeStamp <= '2010-4-21 00:00:00.000')) and TaskName like 'Review1%') AS T
WHERE seq = 1 
and 
case
when (eventid in 
(Select eventid from 
eventrecords 
where TaskName = 'End') then 1 
else 0) as bit
end
order by eventid

当我尝试运行它时,我得到:“关键字'then'附近的语法不正确。” 不知道我做错了什么。在任何地方都没有看到任何像这样的例子。

我应该提到 eventrecords 有一个主键,但是当我包含它时它似乎没有任何帮助,而且我不允许更改表。(呃)我收到了一个使用游标和临时表的建议,但我不确定在报告运行时这会如何影响性能。提前致谢。

4

3 回答 3

0

不必将结果从 IN 转换为整数。你可以这样做:

and eventid in (
    Select eventid from 
    eventrecords
    where TaskName = 'End'
)
于 2010-04-29T21:02:15.293 回答
0

尝试在 , 之后添加另一个括号'End')'End'))然后删除 0 之后的括号,如else 0 as bit end

于 2010-04-29T21:03:18.020 回答
0

如果我正确理解您的问题,您将能够使用由 CASE 包围的子查询来解决此问题。子查询检查在同一时期内是否有一条(或多条)记录具有相同的 eventid 且 TaskName='End'。然后,如果存在这样的行,则 CASE 子句返回 1,如果不返回 0。

SELECT eventid,
       TimeStamp,
       TaskName,
       filepath,
       CASE WHEN EXISTS (SELECT 1 FROM eventrecords WHERE TaskName = 'End' and TimeStamp BETWEEN '2010-04-01' AND '2010-04-21' and eventid = T.eventid) THEN 1 ELSE 0 END as TaskNameEndExists
FROM (SELECT eventid, TimeStamp, filepath, TaskName, 
      ROW_NUMBER() OVER(PARTITION BY eventid ORDER BY TimeStamp DESC) AS seq 
      FROM eventrecords where ((TimeStamp >= '2010-4-1 00:00:00.000') and (TimeStamp <= '2010-4-21 00:00:00.000')) and TaskName like 'Review1%') AS T 
WHERE seq = 1
order by eventid 
于 2010-05-02T00:20:51.067 回答