Ms Access запрос даты предыдущего дня - PullRequest
0 голосов
/ 03 октября 2018

Как составить запрос в Ms Access, чтобы включить суммы накануне в качестве начального баланса.Таким образом, при выполнении запроса я ввожу 3/10/18 в поле параметра WorkDay и показываются записи за 3/10/18 и 2/10/18.Таблица настроена следующим образом:

WorkDay .... TranactionID .... Сумма

2/10/18 ...... Открытие ........1000

2/10/18 ...... Кредит ......... 500

2/10/18 ....... Дебет ......... 300

3/10/18 ....... Кредит ........ 700

3/10/18 ....... Дебет ......... 200

Так что, если я выполню запрос для 3/10/18, он должен вернуть

WorkDay .... TranactionID ....Amount

2/10/18 ...... [Expr] ......... 800

3/10/18 .......Кредит ........ 700

3/10/18 ....... Дебет ......... 200

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Сначала несколько замечаний по запросу:

  1. Требуемые результаты предъявляют разные требования к текущему и предыдущему дню, поэтому должно быть два разных запроса.Если вы хотите, чтобы они были в одном наборе результатов, вам нужно будет использовать UNION.

    • (Вы можете написать один запрос SQL UNION, но так как запросы UNION вообще не работают с визуальным конструктором,вам остается написать и протестировать запрос без каких-либо преимуществ конструкторского представления запроса. Поэтому я предпочитаю создавать два сохраненных запроса вместо встроенных подзапросов, а затем создавать UNION, который объединяет результаты сохраненных запросов.)
  2. Ни в вопросе, ни в ответах на комментарии не указано, что делать с какими-либо исключениями, такими как пропущенные даты, выходные и т. Д. В следующих запросах буквально без исключения принимается «день до».

  3. Другая сложность заключается в том, что записи о кредите также содержат положительную сумму, поэтому вы должны обрабатывать их специально.Если кредиты были сохранены с отрицательными значениями, суммирование было бы простым и прямым.

QueryCurrent:

PARAMETERS [Which WorkDay] DateTime;
SELECT S.WorkDay, S.TransactionID, Sum(S.[Amount]) As Amount
FROM [SomeUnspecifiedTable] As S
WHERE S.WorkDay = [Which WorkDay]
GROUP BY S.WorkDay, S.TransactionID

QueryPrevious:

PARAMETERS [Which WorkDay] DateTime;
SELECT S.WorkDay, "[Expr]" As TransactionID, 
  Sum(IIF(S.TransactionID = "Credit", -1, 1) * S.[Amount]) As Amount
FROM [SomeUnspecifiedTable] As S
WHERE S.WorkDay = ([Which WorkDay] - 1)
GROUP BY S.WorkDay

Запрос на объединение:

SELECT * FROM QueryCurrent
UNION
SELECT * FROM QueryPrevious
ORDER BY [WorkDay]

Замечания по поводу решения:

  • Вы также можете использовать функцию DateAdd (), но добавление / вычитание целых чисел из дат по умолчанию приводит к смене дней.
0 голосов
/ 03 октября 2018

Если вы используете графический интерфейс, добавьте DateAdd("d",-1,[MyDateParameter]) к строке ИЛИ в [MyDateParameter] в поле Workday.

Для оператора SQL WHERE вы должны использовать

WorkDay=[MyDateParameter] OR Workday=DateAdd("d",-1,[MyDateParameter])

Очевидно, замените [MyDateParameter] каким бы ни был ваш параметр даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...