2012-01-22 12 views
6

Posso chiedere il vostro aiuto con quanto segue?Calcolo della differenza rispetto al record precedente

Sto cercando di calcolare una modifica da un record al successivo nei miei risultati. Sarà probabilmente utile se ti mostro la mia strategia e risultati attuali ...

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; 

La query mi dà questi risultati ...

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 

Idealmente, i risultati che vorrebbero ottenere, sarebbe essere simile al seguente ...

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 

Guardando la riga per '17/01/2012' , 'tCambiare' ha un valore di 5 come il '' TAccounts è aumentato dal precedente 526 a 531. E il 'FChange' sarebbe basato sul 'F campo 'unded'. Immagino che qualcosa di cui essere a conoscenza sia il fatto che la riga precedente di questo esempio sia datata '13/01/2012 '. Quello che voglio dire è che ci sono dei giorni in cui non ho dati (per esempio durante i fine settimana).

Penso di aver bisogno di usare un SubQuery ma sto davvero cercando di capire da dove iniziare. Potresti mostrarmi come ottenere i risultati di cui ho bisogno per favore?

sto utilizzando MS Access 2010

Molte grazie per il vostro tempo.

Johnny.

+0

I non pensare che una subquery h scappare. Voto positivo – JonAlb

risposta

1

Ecco un approccio che si potrebbe provare ...

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 

Invece di utilizzare un Group By ho usato subquerys ottenere sia TAccounts e finanziato, così come il precedente audit Data, che viene poi utilizzato sulla dichiarazione principale SELECT per ottenere TAccounts e Finanziamenti di nuovo ma questa volta per la data precedente, in modo che qualsiasi calcolo richiesto possa essere fatto contro di loro.

ma immagino questo può essere lento per elaborare

+0

Grazie proveremo questo e aggiorneremo la domanda. Saluti. – Johnny

0

E 'un peccato MS non ha mai fatto questo tipo di cose semplici in Access, quante righe stai lavorando con il vostro rapporto?

Se è inferiore a 65 K, suggerirei di riversare i dati su un foglio di calcolo Excel e utilizzando una semplice formula per calcolare il diverso tra le righe.

+0

grazie per il consiglio. Excel è un'opzione, ma volevo davvero usare Access se possibile. Ho comunque 65k + record, anche se penso che Excel 2010 possa gestire fino a 1 milione di righe ora ... Penso. Johnny. – Johnny

+0

Non abbiate paura di utilizzare questa soluzione se si tratta di un lavoro di tipo use-once su un set di dati che il computer può gestire facilmente. Utilizzare uno strumento per utilizzare uno strumento quando ne esiste uno migliore è una piaga del tuo tempo – JustinJDavies

0

Si può provare qualcosa di simile a quanto segue (SQL non è testato e richiederà alcune modifiche)

SELEZIONA

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

DA

( 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

Grazie per aver trovato il tempo di rispondere. Sfortunatamente il motore di MS Access DB non gradisce "ROW_NUMBER()". Johnny. – Johnny

Problemi correlati