2010-04-29 93 views
0

尝试将单个查询放在一起以便最终在SQL Server 2005报表中使用。我需要:SQL Server 2005 - 使用case语句进行查询

  1. 拉一个时间范围内的“eventid”列中的值的所有不同的记录 - 这似乎工作。
  2. 对于上面引用的每个eventid,我需要搜索同一个eventid的所有实例,以查看是否存在TaskName为'review1%'的另一条记录。再次,这似乎工作。
  3. 这是事情变得复杂的地方:对于TaskName与review1类似的每个记录,我需要查看是否有另一条记录存在相同的eventid和TaskName ='End'。最近,我需要计算多少个记录的TaskName类似于'review1%',然后有多少个TaskName如'review1%'和TaskName ='End'。我认为这可以通过为每个记录设置一个新的值来完成,并为事件ID,如果记录与TASKNAME =“终结”,设置为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 

这将带回的事件ID的也有TASKNAME =“终结” :

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 

当我尝试运行此,我得到:“附近关键字‘然后’的语法不正确。”不知道我做错了什么。在任何地方都没有见过这样的例子。

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

回答

0

不需要将IN的结果转换为整数。你可以这样做:

and eventid in (
    Select eventid from 
    eventrecords 
    where TaskName = 'End' 
) 
+0

马克,我想如果TASKNAME检查与相同的事件ID exisits,我希望它显示是/否,真/假的价值。如果我离开查询,就会返回所有包含TaskName记录的Eventid,如'Review1%',另一条记录的TaskName ='End'。我需要在报告中获得'End'和没有End的记录总值。 – user329266 2010-04-30 12:25:01

+0

@ user329266:我想帮助更多,但您的问题很难遵循。如果您发布a)所有表定义b)将测试数据插入到这些表中的一些SQL语句,例如,每个表格有10行c)在测试数据上运行时查询所需的输出 – 2010-04-30 13:09:56

0

尝试增加其他括号'End')后,像'End'))和去除0后的括号,如else 0 as bit end

+0

试过了。现在它抛出以下内容:'关键字附近的语法不正确'为'。' – user329266 2010-04-30 12:21:28

0

如果我理解你的问题正确,你就可以将它与一个被CASE包围的子查询。子查询检查在同一时间段内是否有一个(或多个)记录,并且具有TaskName ='End'的相同EvenID。然后,如果这样的行存在,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