2012-01-22 13 views
6

Czy mogę prosić o pomoc w następujący sposób?Obliczanie różnicy w stosunku do poprzedniego rekordu

Próbuję obliczyć zmianę z jednego rekordu na następny w moich wynikach. Będzie to prawdopodobnie pomoże, jeśli pokażę ci moje aktualne zapytanie i wyników ...

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; 

Kwerenda daje mi te wyniki ...

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 

Idealnie wyniki chciałabym dostać, prawda być podobny do następującego ...

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 

Patrząc na wierszu '17/01/2012' , «TChange» ma wartość 5 jako «TAccounts» wzrosła od poprzedniego 526 do 531. I "FChange" byłby oparty na "F unded ". Domyślam się, że poprzedni wiersz w tym przykładzie jest datowany na "13/01/2012". Chodzi mi o to, że są dni, w których nie mam danych (na przykład w weekendy).

Myślę, że potrzebuję użyć podkatalogu, ale naprawdę mam problem z ustaleniem, od czego zacząć. Czy możesz mi pokazać, jak uzyskać potrzebne rezultaty?

Używam MS Access 2010

Wielkie dzięki za poświęcony czas.

Johnny.

+0

I nie myśl, że podzapytanie będzie h porwij cię. Upvote – JonAlb

Odpowiedz

1

Oto jedno podejście można spróbować ...

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 

Zamiast korzystać z Group By mam używany subquerys aby oba TAccounts i finansowane, jak również datę poprzedniego audytu, który jest następnie używany na głównym oświadczeniu SELECT, aby otrzymać zwroty podatku i środki ponownie, ale tym razem na poprzednią datę, tak aby można było wykonać wobec nich wymagane obliczenia.

Ale to sobie wyobrazić to może być powolne przetwarzanie

+0

Dzięki temu spróbujemy i zaktualizujemy pytanie. Twoje zdrowie. – Johnny

0

Szkoda MS nigdy się tego typu rzeczy proste w dostępie, ile wierszy współpracujecie w raporcie?

Jeśli jest poniżej 65K, sugerowałbym wyrzucenie danych do arkusza kalkulacyjnego Excel i użycie prostej formuły do ​​obliczenia różnicy między wierszami.

+0

dzięki za poradę. Excel jest opcją, ale naprawdę chciałem użyć Access, jeśli to możliwe. Mam mimo wszystko 65k + rekordów, chociaż myślę, że Excel 2010 może obsłużyć do 1 miliona wierszy teraz ... Myślę. Johnny. – Johnny

+0

Nie bój się korzystać z tego rozwiązania, jeśli jest to zadanie jednorazowe na zestawie danych, który komputer może z łatwością zarządzać. Używanie narzędzia w celu korzystania z narzędzia, gdy jest lepsze, jest zarażeniem twojego czasu. – JustinJDavies

0

Można spróbować coś jak następuje (SQL jest niesprawdzone i będzie wymagać pewnych zmian)

SELECT

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

OD

( 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

Dzięki za poświęcenie czasu na odpowiedź. Niestety silnik MS Access DB nie lubi "ROW_NUMBER()". Johnny. – Johnny

Powiązane problemy