SQL Server 2005 - запрос с указанием регистра - PullRequest
0 голосов
/ 30 апреля 2010

Попытка объединить один запрос для последующего использования в отчете SQL Server 2005. Мне нужно:

  1. Извлечь все отдельные записи для значений в столбце "Eventid" за определенный промежуток времени - похоже, это работает.
  2. Для каждого события, указанного выше, мне нужно найти все экземпляры одного и того же события, чтобы узнать, есть ли еще запись с именем TaskName, например, «review1%». Опять же, это похоже на работу.
  3. Вот где все усложняется: для каждой записи, где TaskName похожа на review1, мне нужно посмотреть, существует ли другая запись с таким же Eventid и где TaskName = 'End'. В конечном счете, мне нужно подсчитать, сколько записей имеют TaskName, например, «review1%», а затем сколько TaskName, например, «review1%» AND 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':

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

Итак, я попробовал следующее для TRY, чтобы выполнить # 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 есть первичный ключ, но, кажется, он ничего не помогает, когда я его включаю, и мне не разрешено менять таблицу. (тьфу) Я получил одно предложение использовать курсор и временную таблицу, но я не уверен, насколько плохо это может снизить производительность при запуске отчета. Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 30 апреля 2010

Попробуйте добавить еще одну скобку после 'End'), например 'End')), и удалите скобку после 0, как else 0 as bit end

0 голосов
/ 02 мая 2010

Если я правильно понимаю ваш вопрос, вы сможете сделать это с помощью подзапроса, окруженного CASE. Подзапрос проверяет, есть ли одна (или более) запись за тот же период и с тем же событием, у которого есть TaskName = 'End'. Затем, если такая строка существует, предложение 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 
0 голосов
/ 30 апреля 2010

Нет необходимости преобразовывать результат из IN в целое число. Вы можете просто сделать это:

and eventid in (
    Select eventid from 
    eventrecords
    where TaskName = 'End'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...