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

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

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

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

Johnny.

+0

I не думаю, что подзапрос будет 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 

Вместо использование Group By я использовал subquerys, чтобы получить как Taccounts и накопительные, а также Предыдущая дата аудита, который затем используется в основном заявлении SELECT, чтобы снова получить TAccounts и Funded, но на этот раз для предыдущей даты, чтобы любые необходимые вычисления могли быть сделаны против них.

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

+0

Спасибо, попробуем это и обновим вопрос. Приветствия. – Johnny

0

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

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

+0

спасибо за совет. Excel - это вариант, но я действительно хотел использовать Access, если это возможно. В любом случае, у меня есть записи 65k +, хотя, думаю, Excel 2010 может обрабатывать до 1 миллиона строк сейчас ... Я думаю. Джонни. – Johnny

+0

Не бойтесь использовать это решение, если это одноразовое задание на наборе данных, с которым может легко справиться ваш компьютер. Использование инструмента для использования инструмента, когда лучший существует, - это вред в ваше время. – JustinJDavies

0

Вы можете попробовать что-то вроде следующего (SQL не тестировался и потребует некоторых изменений)

ВЫБРАТЬ

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

ИЗ

( 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

Смежные вопросы