Calculating difference from previous record

ε祈祈猫儿з 提交于 2019-12-21 04:55:35

问题


May I ask for your help with the following please ?

I am trying to calculate a change from one record to the next in my results. It will probably help if I show you my current query and results ...

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;

The query gives me these results ...

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

Ideally, the results I would like to get, would be similar to the following ...

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 

Looking at the row for '17/01/2012', 'TChange' has a value of 5 as the 'TAccounts' has increased from previous 526 to 531. And the 'FChange' would be based on the 'Funded' field. I guess something to be aware of is the fact that the previous row to this example, is dated '13/01/2012'. What I mean is, there are some days where I have no data (for example over weekends).

I think I need to use a SubQuery but I am really struggling to figure out where to start. Could you show me how to get the results I need please ?

I am using MS Access 2010

Many thanks for your time.

Johnny.


回答1:


Here is one approach you could try...

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

Instead of using a Group By I've used subquerys to get both TAccounts and Funded, as well as the Previous Audit Date, which is then used on the main SELECT statement to get TAccounts and Funded again but this time for the previous date, so that any required calculation can be done against them.

But I would imagine this may be slow to process




回答2:


It's a shame MS never made this type of thing simple in Access, how many rows are you working with on your report?

If it's under 65K then I would suggest dumping the data on to an Excel spreadsheet and using a simple formula to calculate the different between rows.




回答3:


You can try something like the following (sql is untested and will require some changes)

SELECT

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

FROM

(  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

INNER JOIN

(   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


来源:https://stackoverflow.com/questions/8961948/calculating-difference-from-previous-record

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!