2012-01-22 26 views
6

¿Puedo solicitar su ayuda con lo siguiente, por favor?Cálculo de diferencia con el registro anterior

Estoy tratando de calcular un cambio de un registro a otro en mis resultados. Es probable que le ayudará si te muestro mi consulta y los resultados actuales ...

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 consulta me da estos resultados ...

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, los resultados que desea obtener, lo haría ser similar al siguiente ...

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 

en cuanto a la fila de '17/01/2012' , 'tCambie' tiene un valor de 5 como los '' TAccounts anterior ha aumentado de 526 a 531. Y el 'FChange' se basaría en 'F campo desdoblado '. Supongo que hay que tener en cuenta que la fila anterior a este ejemplo está fechada el '13/01/2012 '. Lo que quiero decir es que hay algunos días en los que no tengo datos (por ejemplo, durante los fines de semana).

Creo que necesito usar un SubQuery, pero realmente estoy luchando por saber por dónde empezar. ¿Podría mostrarme cómo obtener los resultados que necesito, por favor?

estoy usando MS Access 2010

Muchas gracias por su tiempo.

Johnny.

+0

I no creo que una subconsulta h elp yout. Voto – JonAlb

Respuesta

1

Aquí es uno de los enfoques que podría intentar ...

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 

En lugar de utilizar un Group By He usado subquerys de conseguir ambos TAccounts y financiado, así como la auditoría de fecha anterior, que luego se utiliza en la instrucción principal SELECT para obtener TAccounts y fondos nuevamente, pero esta vez para la fecha anterior, para que cualquier cálculo requerido pueda realizarse en su contra.

pero me imagino que esto puede ser lento para procesar

+0

Gracias intentaremos esto y actualizaremos la pregunta. Aclamaciones. – Johnny

0

Es una pena MS nunca hizo este tipo de cosa simple de acceso, el número de filas está trabajando con en su informe?

Si es menor de 65 K, entonces sugeriría arrojar los datos a una hoja de cálculo de Excel y usar una fórmula simple para calcular las diferentes filas.

+0

gracias por el consejo. Excel es una opción, pero realmente quería usar Access si fuera posible. Tengo 65k + registros de todos modos, aunque creo que Excel 2010 puede manejar hasta 1 millón de filas ahora ... creo. Johnny. – Johnny

+0

No tenga miedo de usar esta solución si se trata de un trabajo de uso único en un conjunto de datos que su computadora puede administrar fácilmente. Usar una herramienta para usar una herramienta cuando existe una mejor es una pérdida de tiempo – JustinJDavies

0

Usted puede intentar algo como lo siguiente (SQL no se ha probado y requerirá algunos cambios)

SELECT

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

DE

( 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 

combinación interna

( 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

Gracias por tomarse el tiempo para responder. Desafortunadamente, al motor MS Access DB no le gusta 'ROW_NUMBER()'. Johnny. – Johnny

Cuestiones relacionadas