вернуть все записи, где завершенная дата больше, чем следующая дата оплаты предыдущей записи? - PullRequest
0 голосов
/ 13 декабря 2011

Хорошо, это выглядит как сложный запрос из-за плохого дизайна базы данных, но, увы, он есть и нуждается в решении. Таблица имеет 5 полей: id (PK), itemNumber (FK), completeDate, completeBy (FK), nextDue.

В приложении, когда кто-то записывает задание как выполненное, оно заполняет полную дату завершения, вычисляет дату следующего платежа и помещает ее в следующее время.

Что мне нужно, так это запрос, который в основном просматривает дату nextDue записи, затем просматривает следующую запись, имеющую тот же itemNumber, и сравнивает ее с завершенной датой; затем верните строку, если число завершенных дат превышает дату завершения. Имеет ли это смысл? Можно ли это сделать? Похоже, что это должно быть сделано процедурно против чистого SQL. ТИА

UDPATE: Я думаю, я должен быть более конкретным. Мне нужно использовать этот запрос в отчете, поэтому, если это нужно сделать в VBA, я не уверен, как получить результаты в этом.

enter image description here

1 Ответ

1 голос
/ 13 декабря 2011

Я считаю, что лучший способ думать об этих странных запросах - разбить их на более мелкие управляемые запросы. Итак, я думаю об этом как о первом сопоставлении, а затем о сравнении двух записей: «текущих» и «следующих» записей. Первое, что мы хотим сделать, - это связать каждую запись (которая станет «текущей») с соответствующей «следующей» записью.

Итак, во-первых, запрос, который получает все идентификаторы записей и соответствующие им «следующие записи». При этом используется выражение «<» в выражении JOIN для получения всех записей, следующих за текущей записью. </p>

SELECT
     T.id as currentId,
     MIN(A.id) as nextId
FROM
     rec_completionDate as T
          JOIN
     rec_completionDate as A ON T.itemNumber = A.itemNumber and T.id < A.id
GROUP BY
     T.id

Выполните запрос, который, используя вышеуказанное в качестве подзапроса, возвращает все соответствующие поля для каждой записи (текущей и следующей):

SELECT
     current.*,
     next.*
FROM
     ( ... [subquery goes here] ...) sq
          JOIN
     rec_completionDate as current ON sq.currentId = current.id
          JOIN
     rec_completionDate as next ON sq.nextId = next.id

Наконец, мы хотим ограничить результаты этого последнего запроса следующим предложением WHERE:

WHERE
     next.completedDate > current.nextDue

Итак, все вместе:

SELECT
     current.*,
     next.*
FROM
     ( 
     SELECT
          T.id as currentId,
          MIN(A.id) as nextId
     FROM
          rec_completionDate as T
               JOIN
          rec_completionDate as A ON T.itemNumber = A.itemNumber and T.id < A.id
     GROUP BY
          T.id
     ) sq
          JOIN
     rec_completionDate as current ON sq.currentId = current.id
          JOIN
     rec_completionDate as next ON sq.nextId = next.id
WHERE
     next.completedDate > current.nextDue
...