2015-07-14 1 views
1

Я хочу написать выражение в моем запросе Access, чтобы проверить, есть ли элемент, который мы запускаем. на следующей неделе запустил 4 недели до этой даты. У меня возникли проблемы с пониманием того, как вы можете проверить что-то в одном запросе, а затем использовать возвращаемое значение этой проверки, чтобы проверить еще несколько вещей. Метод, который я пытался написать, сделать другой запрос, который будет использовать результаты первого запроса (где элементы из 7/20/2015 изолированы), чтобы проверить даты этих элементов, но я столкнулся с проблемой, потому что тогда мне нужно связать назад этот запрос к исходной таблице, которая дублирует данные.Как вы проверяете поле в запросе для определенных значений тогда и только тогда, когда другое поле имеет определенное значение?

Написанный в псевдо-коде, это будет выглядеть примерно так следующее:

Если item имеет job_date из 7/20/2015, проверьте все экземпляры этого элемента до 7/20/2015 и если нет экземпляра для 7/13/2015 недель, 7/6/2015, 6/29/2015, или 6/22/2015, а затем вернуть item.

Написан в более наглядном виде:

item   job_date 
A    6/22/2015 
A    6/29/2015 
A    7/6/2015 
A    7/13/2015 
A    7/20/2015 

item   job_date 
B    6/15/2015 
B    
B    
B    
B    
B    7/20/2015 

item   job_date 
C    6/22/2015 
C    
C    
C    7/13/2015 
C    7/13/2015 
C    7/20/2015 

item   job_date 
D    
D    
D    
D    
D    
D    

Пункт А не будет возвращен, потому что мы работаем непрерывно. Пункт B вернется, потому что, хотя мы запустили его на 6/15/2015, это было более чем за 4 недели до 7/20/2015. Item D не вернется, потому что у него нет строки с заданной датой (7/20/2015).

Примечание:

  • В идеале, я буду использовать выражение, которые всегда будут определять дату на следующей неделе автоматически, я просто использовал жесткие сроки для ясности. Если вы хотите использовать твердые даты, пожалуйста, не стесняйтесь.

  • Наши недели начинаются по понедельникам.

  • Товар может работать несколько раз в неделю. Например, Item C может иметь 2 ряда с 7/13/2015 и 7/13/2015. Номер задания (не показан, но существует в той же таблице) является уникальным идентификатором в таблице. Если бы Item C выполнялись дважды, то заданиями были бы H000001584-0030 и H00001584A-0030.

+0

Если * 7/20/2015 job_date * для пункта * B * не было, будет * B * быть включены в набор результатов запроса (когда целевая дата * 7/20/2015 *) ? – HansUp

+0

Нет. Это связано с тем, что мы рассматриваем только элементы со строкой, которая имеет заданную дату. Затем этот список элементов будет проверен на предыдущие недели. – whatwhatwhat

+0

Будет ли * job_date * всегда быть либо Null, либо дата понедельника? – HansUp

ответ

2

Запрос ниже возвращает этот результат набора данных из вашего образца, когда я поставляю 7/20/2015 в качестве значения параметра:

item 
---- 
B 

Запрос включает в себя подчиненный запрос, который возвращает те элементы, которые имеют строки с job_date значения за 28 дней до указанной даты. Обратите внимание, что в подзапросе не возвращается пункт, который не имел job_date значений в этом диапазоне --- поэтому он дает вам только те предметы, которые имели job_date в этом диапазоне. Поэтому левое соединение с подзапросом и запрос только строк, где «правая сторона» - это «Нуль», означает, что мы исключаем эти элементы из окончательного набора результатов.

PARAMETERS pTarget DateTime; 
SELECT j.item 
FROM 
    dbo_job AS j 
    LEFT JOIN 
    (
     SELECT [item] 
     FROM dbo_job 
     WHERE job_date>=DateAdd('d', -28, [pTarget]) And job_date<[pTarget] 
     GROUP BY [item] 
    ) AS sub 
    ON j.item = sub.item 
WHERE j.job_date=[pTarget] AND sub.item Is Null 
GROUP BY j.item; 
+0

Ничего, кроме того, что за четыре недели до этого может не означать ровно 28 дней, поэтому вам придется использовать 'DateDiff (« ww », date1, date2, 2, 2)'. – Gustav

+0

Я вставил в ваш запрос, и я получаю сообщение об ошибке «Вы пытались выполнить запрос, который не включает указанное выражение« элемент »как часть агрегатной функции». Все, что я сделал, это вставить и отрегулировать инструкцию SELECT и поместить в pTarget. 'ПАРАМЕТРЫ pTarget DateTime; ВЫБОР dbo_job.item ОТ dbo_job КАК J LEFT JOIN ( SELECT [пункт] ОТ dbo_job ГДЕ job_date> = DateAdd ('d', -28, # 7/20/2015 #) и job_date <# 7/20/2015 # GROUP BY пункт ) AS суб ПО j.item = sub.item ГДЕ j.job_date = # 7/20/2015 # И sub.item Is Null GROUP BY j.item; ' – whatwhatwhat

+1

Здесь: 'SELECT dbo_job.item FROM dbo_job AS j' Поскольку' dbo_job' является псевдонимом 'AS j', вы не можете запрашивать' dbo_job.item' Вместо этого используйте 'SELECT j.item', как я это сделал, или drop псевдоним. Обратите внимание, что если вы отбрасываете псевдоним, вам нужно будет изменить все другие ссылки 'j.'. – HansUp