Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL Server 2005-带case语句的查询_Sql Server 2005_Tsql_Cursor_Reporting Services_Temp Tables - Fatal编程技术网

Sql server 2005 SQL Server 2005-带case语句的查询

Sql server 2005 SQL Server 2005-带case语句的查询,sql-server-2005,tsql,cursor,reporting-services,temp-tables,Sql Server 2005,Tsql,Cursor,Reporting Services,Temp Tables,尝试将单个查询放在一起,以便最终在SQLServer2005报表中使用。我需要: 在一个时间范围内,为eventid列中的值拉入所有不同的记录-这似乎有效。 对于上面引用的每个eventid,我需要搜索相同eventid的所有实例,以查看是否有另一个TaskName为“review1%”的记录。同样,这似乎是可行的。 这就是事情变得复杂的地方:对于TaskName类似于review1的每个记录,我需要查看是否存在另一个具有相同eventid的记录,以及TaskName='End'的位置。实际上,

尝试将单个查询放在一起,以便最终在SQLServer2005报表中使用。我需要:

在一个时间范围内,为eventid列中的值拉入所有不同的记录-这似乎有效。 对于上面引用的每个eventid,我需要搜索相同eventid的所有实例,以查看是否有另一个TaskName为“review1%”的记录。同样,这似乎是可行的。 这就是事情变得复杂的地方:对于TaskName类似于review1的每个记录,我需要查看是否存在另一个具有相同eventid的记录,以及TaskName='End'的位置。实际上,我需要计算有多少条记录具有TaskName(如“review1%”),然后有多少条记录具有TaskName(如“review1%”和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有一个主键,但是当我包含它时,它似乎没有任何帮助,并且我不允许更改表。呃,我收到一个使用游标和临时表的建议,但我不确定当报表运行时,这将如何影响性能。提前谢谢

无需将结果从IN转换为整数。您可以这样做:

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

尝试在“End”后面添加另一个括号,如“End”,并删除0后面的括号,否则0作为位End

如果我正确理解您的问题,您将能够使用一个由大小写包围的子查询来解决此问题。子查询检查在同一时间段内是否有一条或多条具有相同eventid且TaskName='End'的记录。然后,如果存在这样的行,CASE子句将返回1,如果不是0,则返回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 

试过这个。现在它抛出以下内容:“关键字“as.”附近的语法不正确。标记,我试图检查是否存在具有相同eventid的TaskName,并希望它显示yes/no、true/false类型的值。如果我像您一样保留查询,它只会返回所有eventid,其中包含一条TaskName为'Review1%'的记录和另一条TaskName为'End'的记录。我需要在我的报告中获得带“End”和不带“End”的记录的总值。@user329266:我想提供更多帮助,但你的问题很难回答。如果您发布a所有表定义b一些将测试数据插入这些表的SQL语句,例如每个表10行c在测试数据上运行时所需的查询输出,我可以为您提供更多帮助