0

最終的に SQL Server 2005 レポートで使用するために、1 つのクエリをまとめようとしています。する必要がある:

  1. 時間枠の「eventid」列の値のすべての個別のレコードを取得します-これは機能しているようです。
  2. 上記のイベント ID ごとに、同じイベント ID のすべてのインスタンスを検索して、「review1%」などの TaskName を持つ別のレコードがあるかどうかを確認する必要があります。繰り返しますが、これはうまくいくようです。
  3. ここからが複雑になります。TaskName が review1 のようなレコードごとに、同じ eventid を持ち、TaskName='End' である別のレコードが存在するかどうかを確認する必要があります。最終的に、'review1%' のような TaskName を持つレコードの数と、'review1%' AND TaskName='End' のような TaskName を持つレコードの数が必要です。これは、各レコードに新しい値を設定し、イベント ID に、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' を持つイベント ID が返されます。

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 には主キーがあることに言及する必要がありますが、それを含めても何の役にも立たないようで、テーブルを変更することは許可されていません。(うーん) カーソルと一時テーブルを使用するという提案を 1 つ受け取りましたが、レポートの実行時にパフォーマンスがどれほど低下するかはわかりません。前もって感謝します。

4

3 に答える 3

0

私があなたの質問を正しく理解していれば、CASEで囲まれたサブクエリでこれを行うことができます。サブクエリは、同じ期間内に、TaskName ='End'を持つ同じeventidを持つ1つ(または複数)のレコードがあるかどうかをチェックします。次に、そのような行が存在する場合、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 に答える
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 に答える