【问题标题】:Calculating difference from previous record计算与先前记录的差异
【发布时间】:2012-01-22 14:55:30
【问题描述】:

我可以请您帮忙解决以下问题吗?

我正在尝试计算结果中从一条记录到另一条记录的变化。如果我向您展示我当前的查询和结果可能会有所帮助...

SELECT A.AuditDate, COUNT(A.NickName) as [TAccounts],
       SUM(IIF((A.CurrGBP > 100 OR A.CurrUSD > 100), 1, 0)) as [Funded]
FROM Audits A
GROUP BY A.AuditDate;

查询给了我这些结果...

AuditDate D/M/Y         TAccounts     Funded                    
--------------------------------------------
30/12/2011              506           285
04/01/2012              514           287
05/01/2012              514           288
06/01/2012              516           288
09/01/2012              520           289
10/01/2012              522           289
11/01/2012              523           290
12/01/2012              524           290
13/01/2012              526           291
17/01/2012              531           292
18/01/2012              532           292
19/01/2012              533           293
20/01/2012              537           295

理想情况下,我想要得到的结果类似于以下...

AuditDate D/M/Y         TAccounts     TChange   Funded           FChange
------------------------------------------------------------------------
30/12/2011              506           0         285              0
04/01/2012              514           8         287              2
05/01/2012              514           0         288              1
06/01/2012              516           2         288              0
09/01/2012              520           4         289              1
10/01/2012              522           2         289              0
11/01/2012              523           1         290              1
12/01/2012              524           1         290              0
13/01/2012              526           2         291              1
17/01/2012              531           5         292              1
18/01/2012              532           1         292              0
19/01/2012              533           1         293              1
20/01/2012              537           4         295              2 

查看“17/01/2012”行,“TChange”的值为 5,因为“TAAccounts”已从之前的 526 增加到 531。“FChange”将基于“Funded”场地。我想需要注意的是,此示例的前一行的日期为 '13/01/2012'。我的意思是,有些日子我没有数据(例如周末)。

我想我需要使用 SubQuery,但我真的很难弄清楚从哪里开始。你能告诉我如何得到我需要的结果吗?

我正在使用 MS Access 2010

非常感谢您的宝贵时间。

约翰尼。

【问题讨论】:

  • 我不认为子查询会帮助你。点赞

标签: sql ms-access subquery


【解决方案1】:

这是您可以尝试的一种方法...

SELECT B.AuditDate,B.TAccounts,
    B.TAccount - 
    (SELECT Count(NickName) FROM Audits WHERE AuditDate=B.PrevAuditDate) as TChange,
    B.Funded - 
    (SELECT Count(*) FROM Audits WHERE AuditDate=B.PrevAuditDate AND (CurrGBP > 100 OR CurrUSD > 100)) as FChange
FROM (
SELECT A.AuditDate,
    (SELECT Count(NickName) FROM Audits WHERE AuditDate=A.AuditDate) as TAccounts,
    (SELECT Count(*) FROM Audits WHERE (CurrGBP > 100 OR CurrUSD > 100)) as Funded,
    (SELECT Max(AuditDate) FROM Audits WHERE AuditDate<A.AuditDate) as PrevAuditDate
FROM
(SELECT DISTINCT AuditDate FROM Audits) AS A) AS B

我没有使用Group By,而是使用子查询来获取 TAccounts 和 Funded,以及上一个审计日期,然后在主要的 SELECT 语句中使用它来再次获取 TAccounts 和 Funded,但这次为上一个日期,以便可以对它们进行任何所需的计算。

但我想这可能处理起来很慢

【讨论】:

    【解决方案2】:

    很遗憾,MS 从未在 Access 中简化此类事情,您在报表中处理了多少行?

    如果它低于 65K,那么我建议将数据转储到 Excel 电子表格中,并使用一个简单的公式来计算行之间的差异。

    【讨论】:

    • 感谢您的建议。 Excel 是一种选择,但如果可能的话,我真的很想使用 Access。无论如何,我有 65k+ 条记录,尽管我认为 Excel 2010 现在可以处理多达 100 万行......我想。约翰尼。
    • 如果它是您计算机可以轻松管理的数据集上的一次性类型作业,请不要害怕使用此解决方案。当存在更好的工具时,为了使用工具而使用工具是对您的时间的一种影响
    【解决方案3】:

    您可以尝试以下方法(sql 未经测试,需要进行一些更改)

    选择

        A.AuditDate,
        A.TAccounts,
        A.TAccounts - B.TAccounts AS TChange,
        A.Funded,
        A.Funded - B.Funded AS FChange
    

    来自

    (  SELECT 
            ROW_NUMBER() OVER (ORDER BY AuditDate DESC) AS ROW, 
            AuditDate, 
            COUNT(NickName) as [TAccounts],
            SUM(IIF((CurrGBP > 100 OR CurrUSD > 100), 1, 0)) as [Funded]
        FROM Audits
        GROUP BY AuditDate
    ) A
    

    内连接

    (   SELECT 
            ROW_NUMBER() OVER (ORDER BY AuditDate DESC) AS ROW, 
            AuditDate, 
            COUNT(NickName) as [TAccounts],
            SUM(IIF((CurrGBP > 100 OR CurrUSD > 100), 1, 0)) as [Funded]
        FROM Audits
        GROUP BY AuditDate
    ) B ON B.ROW = A.ROW + 1
    

    【讨论】:

    • 感谢您抽出宝贵时间回复。不幸的是,MS Access DB 引擎不喜欢“ROW_NUMBER()”。约翰尼。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2023-04-02
    • 1970-01-01
    • 2023-04-09
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多