【问题标题】:Access SQL subquery - count records prior to each date in result set?访问 SQL 子查询 - 在结果集中的每个日期之前计算记录?
【发布时间】:2011-08-12 20:12:34
【问题描述】:

我有一份 Remedy 票证转储,其中包括提交日期和解决日期。我需要做的是计算每个提交了至少一张票的日期:

  1. $date 提交的工单数量
  2. $date 解决的票数
  3. $date 开始营业时仍然开放的门票数量

我有一个查询可以获取项目 1 和 2,但我被困在 3 上。我基本上需要一种方法来查看子查询中的 $date 1 和 2 并将其用作我的 WHERE 子句3 的子查询。

这是我的查询:

SELECT xDate, sTot, cTot, oTot FROM 
(
  (
    (
      SELECT xDate, COUNT(*) AS sTot
      FROM (
        SELECT FORMAT(SubmitDate, "mm/dd/yyyy") AS xDate FROM tblOpenINC
        UNION ALL
        SELECT FORMAT(SubmitDate, "mm/dd/yyyy") AS xDate FROM tblClosedINC
      ) GROUP BY xDate
    ) AS sub

    INNER JOIN

    (
      SELECT FORMAT(LastResolvedDate, "mm/dd/yyyy") AS yDate, COUNT(*) AS cTot
      FROM tblClosedINC
      GROUP BY FORMAT(LastResolvedDate, "mm/dd/yyyy")
    ) AS res

    ON res.yDate = sub.xDate
  )

  INNER JOIN

  (
    SELECT FORMAT(SubmitDate, "mm/dd/yyyy") AS zDate, COUNT(*) AS oTot
    FROM tblClosedINC
    WHERE FORMAT(SubmitDate, "mm/dd/yyyy") < DateValue(xDate)
    GROUP BY FORMAT(SubmitDate, "mm/dd/yyyy")
  ) AS opn

  ON opn.zDate = sub.xDate

) 
ORDER BY DateValue(xDate) ASC

最后一个子查询不起作用,因为它不知道 xDate(第一个子查询的日期)是什么。

如果我必须使用 VBA 执行此操作,我会这样做,但我真的希望能够使用 SQL 执行所有这些操作,以便可以轻松地将原始数据转储到 Excel 等。

另外,为了澄清:当我从 Remedy 获得转储时,我有单独的表用于当前打开或当前处于非打开状态的票证,因此第一个子查询中的 UNION。此外,Remedy 的所有日期字段都有时间戳,因此 FORMAT 函数会去掉时间戳。

【问题讨论】:

    标签: sql ms-access jet


    【解决方案1】:

    尝试将子查询移到顶部。也许这会有所帮助。

    SELECT xDate, sTot, cTot,  
    (SELECT FORMAT(SubmitDate, "mm/dd/yyyy") FROM tblClosedINC WHERE FORMAT(SubmitDate, "mm/dd/yyyy") < DateValue(xDate) GROUP BY FORMAT(SubmitDate, "mm/dd/yyyy")) as zDate,
    (SELECT COUNT(*) FROM tblClosedINC WHERE FORMAT(SubmitDate, "mm/dd/yyyy") < DateValue(xDate)GROUP BY FORMAT(SubmitDate, "mm/dd/yyyy")) as oTot
     FROM 
    (
      (
        (
          SELECT xDate, COUNT(*) AS sTot
          FROM (
            SELECT FORMAT(SubmitDate, "mm/dd/yyyy") AS xDate FROM tblOpenINC
            UNION ALL
            SELECT FORMAT(SubmitDate, "mm/dd/yyyy") AS xDate FROM tblClosedINC
          ) GROUP BY xDate
        ) AS sub
    
        INNER JOIN
    
        (
          SELECT FORMAT(LastResolvedDate, "mm/dd/yyyy") AS yDate, COUNT(*) AS cTot
          FROM tblClosedINC
          GROUP BY FORMAT(LastResolvedDate, "mm/dd/yyyy")
        ) AS res
    
        ON res.yDate = sub.xDate
      )
    
    ) 
    ORDER BY DateValue(xDate) ASC
    

    【讨论】:

    • AND FORMAT(SubmitDate, "mm/dd/yyyy") = sub.xDate 添加到两个子查询应该可以解决这个问题。除非一个 xDate 可以有多个 zDate。如果是这样,那就不行了。
    • 是的,这就是问题所在。它必须从多个日期开始计算 - 给定日期之前的所有日期。
    • 好的,我修改了您的查询,它为我提供了我想要的数字……这真是太慢了。我想这只是 JET 糟糕的 SQL 引擎不可避免的副作用。不过感谢您的帮助...我会立即在 OP 上发布修改后的查询。
    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2018-09-19
    • 2012-10-02
    • 2011-01-31
    相关资源
    最近更新 更多