Расчет разницы с предыдущей записью - PullRequest
6 голосов
/ 22 января 2012

Могу ли я попросить вас помочь со следующим, пожалуйста?

Я пытаюсь рассчитать переход от одной записи к другой в моих результатах.Вероятно, это поможет, если я покажу вам мой текущий запрос и результаты ...

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» будет основываться на поле «Финансируемый».Полагаю, что следует учитывать тот факт, что предыдущая строка этого примера датирована «13/01/2012».Я имею в виду, что в некоторые дни у меня нет данных (например, по выходным).

Я думаю, что мне нужно использовать SubQuery, но я действительно пытаюсь понять, с чего начать.Не могли бы вы показать мне, как получить нужные мне результаты, пожалуйста?

Я использую MS Access 2010

Большое спасибо за ваше время.

Джонни.

Ответы [ 3 ]

1 голос
/ 22 января 2012

Вот один из подходов, который вы можете попробовать ...

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 снова, но на этот раз на предыдущую дату, чтобы можно было выполнить любые необходимые вычисления для них.

Но я бы предположил, что процесс может быть медленным

0 голосов
/ 24 января 2012

Вы можете попробовать что-то вроде следующего (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 голосов
/ 23 января 2012

Обидно, что MS никогда не делала такого рода вещи простыми в Access, сколько строк вы работаете с отчетом?

Если он меньше 65 КБ, я бы посоветовал сбросить данные в электронную таблицу Excel.и используя простую формулу для вычисления различий между строками.

...