从Access数据库中的两条记录计算天差

时间:2019-07-02 19:24:34

标签: sql ms-access

我正在从一个非常复杂的Excel电子表格创建一个Access数据库。在我解决这个问题之前,过程一直进行得很好。该解决方案在Excel中很容易,但是我无法弄清楚如何在Access中做到这一点。

这是我以前在Excel中使用的内容。

我在一张纸上有多个字段的客户列表。然后,我有另一个工作表作为报表,它将运行VBA宏来搜索所有客户的表,并按名称列出每个客户,这是来自我们的联系中心的入站呼叫(Que呼叫),当该呼叫到达时,将计算第三次通话之间的天数。这最后一栏是我在翻译到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

访问权限:

我有一份报告可以浏览我的客户表,并且仅列出来自我们的联系中心(排队呼叫)的那些报告,但是由于设计仅允许我计算出两次呼叫之间的时间,因此我无法弄清楚我要影响一行。我该如何计算?我需要做一个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 Call客户。

描述所需的结果

我希望在最终报告中有一列,该列显示两次调用之间的记录之间经过了多少天。

在此先感谢您提供的任何输入。

1 个答案:

答案 0 :(得分:1)

考虑一个相关的聚合子查询,其中来自同一来源 Customer 的内部查询通过相同的 ID (假定为唯一标识符)与外部查询相关联,并进行日期比较(假定为已创建字段)。请注意,使用表别名 c sub 进行关联。

使用DateDiff表示日期之间的差异。要使用此查询,请在查询下方置于查询设计器的SQL模式下,然后将要用作记录源的对象保存为表单,报表,自行打开或在应用程序代码中用作记录集。

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 Query将输出存储在临时表中,以避免重新运行。