0

SQL Server 2005 보고서에 단일 쿼리를 함께 사용하려고합니다. 다음과 같아야합니다 :SQL Server 2005 - 대/소문이있는 쿼리

  1. "eventid"열의 값에 대한 모든 개별 레코드를 한 프레임 당깁니다. -이 방법이 효과가있는 것 같습니다.
  2. 위에서 언급 한 각 eventid에 대해 동일한 eventid의 모든 인스턴스를 검색하여 TaskName이 'review1 %'와 같은 다른 레코드가 있는지 확인해야합니다. 다시 말하지만, 이것은 효과가있는 것으로 보인다.
  3. 여기에 상황이 복잡해집니다. TaskName이 review1 인 각 레코드에 대해 동일한 eventid 및 TaskName = 'End'가있는 다른 레코드가 있는지 확인해야합니다. 궁극적으로, 얼마나 많은 레코드가 'review1 %'와 같은 TaskName을 가지고 있는지, 그리고 얼마나 많은 TaskName이 'review1 %'및 TaskName = 'End'인지를 필요로합니다. 각 레코드에 대해 새 값을 설정하고 eventid에 대해 TaskName = 'End'로 레코드가 존재하는 경우 1로 설정하고 0으로 설정하면 수행 할 수 있다고 생각합니다.

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 = '종료'를 가지고있는 이벤트 ID 년대 다시 나타납니다을 쿼리는 아래 위의 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')) and TaskName like 'Review1%') AS T 
WHERE seq = 1 
and eventid in 
(Select eventid from 
eventrecords 
where TaskName = 'End') 
order by eventid 

(10)는 그래서 달성하려고 다음과 같은 노력했습니다 # 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

Mark, 동일한 eventid를 가진 TaskName이 존재하는지 확인하려고하며 예/아니오를 표시하려고합니다. , 진실/거짓 종류의 가치. 내가 가지고있는 것처럼 쿼리를 남겨두면 TaskName이 'Review1 %'와 같은 레코드와 TaskName이 'End'인 다른 레코드를 가진 모든 이벤트 ID를 다시 가져옵니다. 내 보고서에 '끝'이있는 레코드와 끝이없는 레코드의 합계 값을 가져와야합니다. – user329266

+0

@ user329266 : 더 많은 도움을 드리고 싶지만 귀하의 질문에 따르기가 다소 어렵습니다.a) 모든 테이블 정의를 게시하면 더 많은 것을 도울 수 있습니다. b) 테스트 데이터를이 테이블에 삽입하는 일부 SQL 문. 각 테이블마다 10 개의 행 c) 테스트 데이터에서 실행될 때 쿼리의 필수 출력 –

0

시도 난 당신이 당신이 이것을 할 수 있습니다 제대로 질문을 이해한다면 else 0 as bit end

+0

시도했습니다. 이제 다음과 같이 throw됩니다 : '키워드'근처의 구문이 잘못되었습니다 '.' – user329266

0

로, 'End'))처럼 'End') 후 다른 괄호를 추가하고 0 후 괄호를 제거 CASE로 둘러싼 하위 쿼리 하위 쿼리는 동일한 기간 내에 하나 이상의 (또는 그 이상의) 레코드가 있고 TaskName이 'End'인 동일한 eventid로 점검합니다. 그런 행이 존재하면 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