Расчет разницы в днях по двум записям в базе данных Access - PullRequest
1 голос
/ 02 июля 2019

Я создаю базу данных Access из очень сложной электронной таблицы Excel. Процесс шел хорошо, пока я не добрался до этой проблемы. Решение легко в Excel, но я не могу понять, как это сделать в Access.

Вот что у меня было раньше в Excel.

У меня был список клиентов на одном листе с несколькими полями. Затем у меня был другой лист в качестве отчета, который запускал макрос VBA для поиска в таблице всех клиентов и перечисления каждого клиента по имени, который был входящим вызовом из нашего контакт-центра (Que Call), когда этот вызов пришел, а затем будет рассчитывать третий столбец для количества дней между звонками. В этой последней колонке я сталкиваюсь с трудностями при переводе в Access. В Excel я бы просто сделал что-то вроде в ячейке C3 =SUM(B3-B2). Учитывая, что таблица выглядела так:

          Column A         Column B      Column C

Row 1     Name             Date          Time Lapse

Row 2     Customer 1       7/1/2019      ----------

Row 3     Customer 2       7/2/2019      =SUM(B3-B2)     <-- 1 day

Row 4     Customer 3       7/4/2019      =SUM(B4-B3)     <-- 2 days

В доступе:

У меня есть отчет, который просматривает мою таблицу клиентов и перечисляет только те из нашего контакт-центра (Que Call), но я не могу понять, как подсчитать время между вызовами, так как дизайн позволяет только мне повлиять на один ряд. Как мне сделать этот расчет? Это SQL-запрос, который мне нужно сделать? Я бы предпочел не иметь отдельной таблицы для вызовов в колл-центре или отдельного столбца в моей таблице клиентов, чтобы рассчитать это, поскольку некоторые клиенты не из центра обработки вызовов. Могу ли я просто запустить отчет или запрос. Любой совет или помощь будет принята с благодарностью.

Текущий код SQL:

SELECT 
     [Customers].FullName, 
     [Customers].ID, 
     [Customers].QueCall, 
     [Customers].Status, 
     [Customers].InterestLevel, 
     [Customers].State, 
     [Customers].Product, 
     [Customers].Created, 
     [Customers].LastContact, 
     [Customers].PrimaryNote 
FROM 
     Customers 
WHERE 
     ((([Customers].QueCall)=True)); 
ORDER BY 
     [Customers].Created;

Опишите точно как не работает (сообщение об ошибке, неожиданные результаты и т. Д ...)

Он просто перечисляет клиентов и не позволяет мне вычислять разницу между тем, когда были созданы записи (то есть, когда с ними впервые связались). В Интернете я нашел много вещей о том, как рассчитать разницу между двумя столбцами одной и той же записи, но не между двумя разными записями; и две разные записи, которые могут не располагаться последовательно друг за другом, поскольку между записями в таблице клиентов могут быть другие клиенты, не являющиеся клиентами Que.

Опишите желаемые результаты

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

Заранее благодарю за любой вклад, который у вас может быть.

1 Ответ

1 голос
/ 02 июля 2019

Рассмотрим коррелированный агрегированный подзапрос, в котором внутренний запрос из того же источника, Клиент , коррелирует с внешним запросом тем же ID (предполагается, что это уникальный идентификатор) со сравнением даты (предполагается, чтобыть Создано поле).Обратите внимание на использование псевдонима таблицы, c и sub для корреляции.

Используйте DateDiff для разницы между датами.Чтобы использовать этот запрос, поместите приведенный ниже запрос в режим SQL в Query Designer и сохраните объект, который будет использоваться в качестве источников записей для форм, отчетов, открытых самостоятельно или используемых в коде приложения в качестве наборов записей.

SELECT 
     c.FullName, 
     c.ID, 
     c.QueCall, 
     c.Status, 
     c.InterestLevel, 
     c.State, 
     c.Product, 
     c.Created, 
     c.LastContact, 
     c.PrimaryNote,

     (SELECT TOP 1 SUM(DateDiff("d", sub.Created, c.Created))
      FROM Customer sub
      WHERE sub.ID = c.ID
        AND sub.Created < c.Created
      GROUP BY sub.Created
      ORDER BY sub.Created DESC) AS TimeElapsed

FROM 
     Customers c
WHERE 
     (((c.QueCall)=True)); 
ORDER BY 
     c.Created;

Имейте в виду, что для больших таблиц этот коррелированный подзапрос может облагаться налогом во времени и производительности.Дайте время для завершения и изучите сохранение выходных данных во временной таблице с помощью запроса Make-Table , чтобы избежать повторного запуска.

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