2010-04-29 34 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