2012-01-22 66 views
6

我可以請求您的幫助嗎?計算與以前記錄的差異

我想在結果中計算從一條記錄到下一條記錄的更改。它可能會幫助,如果我告訴你我現在的查詢和結果...

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的值‘TAccounts’已經從以前的526上升至531。而'FChange'將基於'F無限「的領域。我猜想要注意的是這個例子的前一行是'2013/01/2012'。我的意思是,有些日子我沒有數據(例如週末)。

我想我需要使用一個子查詢,但我真的很努力弄清楚從哪裏開始。你能告訴我如何得到我需要的結果嗎?

我正在使用MS Access 2010

非常感謝您的時間。

Johnny。

+0

我不要認爲子查詢會h elp你。 Upvote – JonAlb

回答

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 

而不是使用我用subquerys兩全TAccounts並資助Group By,以及上次審計日期,然後將其用於在主要的SELECT聲明中再次獲得TAccounts和Funded,但是這次是在前一個日期,以便可以對他們進行任何所需的計算。

但我想這可能是緩慢的處理

+0

謝謝你會嘗試這個並更新問題。乾杯。 – Johnny

0

這是一個恥辱MS從來沒有這種類型的事情在Access簡單,多少行,你與你的報告工作?

如果它在65K以下,那麼我會建議將數據轉儲到Excel電子表格中,並使用一個簡單的公式來計算行之間的差異。

+0

感謝您的意見。 Excel是一個選項,但如果可能的話,我真的很想使用Access。無論如何,我有65k +記錄,儘管我認爲Excel 2010現在可以處理多達100萬行......我想。約翰尼。 – Johnny

+0

如果您的計算機可以輕鬆管理的數據集上使用一次性作業,請不要害怕使用此解決方案。如果存在更好的工具,則使用工具爲您的工具提供一個工具 – JustinJDavies

0

你可以嘗試像以下(SQL是未經測試,並且需要一些變化)

選擇

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 
+0

感謝您花時間回覆。不幸的是MS Access數據庫引擎不喜歡'ROW_NUMBER()'。約翰尼。 – Johnny