2012-01-22 9 views
6

Tôi có thể yêu cầu sự giúp đỡ của bạn với những điều sau đây không?Tính chênh lệch so với hồ sơ trước

Tôi đang cố gắng tính toán thay đổi từ một bản ghi sang bản ghi tiếp theo trong kết quả của mình. Nó có thể sẽ giúp đỡ nếu tôi chỉ cho bạn truy vấn và kết quả hiện tại của tôi ...

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; 

Truy vấn mang lại cho tôi những kết quả ...

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 

Lý tưởng nhất, kết quả tôi muốn có được, sẽ được tương tự như sau ...

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 

Nhìn vào hàng cho '17/01/2012' , 'TChange' có giá trị 5 là 'TAccounts' đã tăng từ trước 526 đến 531. Và 'FChange' sẽ dựa trên 'F trường 'unded'. Tôi đoán một cái gì đó để nhận thức được là một thực tế là hàng trước đó ví dụ này, là ngày '13/01/2012'. Ý tôi là, có một số ngày mà tôi không có dữ liệu (ví dụ như vào cuối tuần).

Tôi nghĩ rằng tôi cần phải sử dụng một SubQuery nhưng tôi thực sự đấu tranh để tìm ra nơi để bắt đầu. Bạn có thể chỉ cho tôi cách lấy kết quả mà tôi cần không?

Tôi đang sử dụng MS Access 2010

Rất cám ơn vì đã dành thời gian của bạn.

Johnny.

+0

tôi đừng nghĩ rằng truy vấn phụ sẽ h giúp bạn. Upvote – JonAlb

Trả lời

1

Dưới đây là một cách tiếp cận bạn có thể thử ...

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 

Thay vì sử dụng một Group By Tôi đã sử dụng subquerys để có được cả hai TAccounts và tài trợ, cũng như ngày Kiểm toán trước, sau đó được sử dụng trên tuyên bố chính của SELECT để nhận TAccount và được cấp lại tiền nhưng lần này cho ngày trước đó, để mọi tính toán bắt buộc có thể được thực hiện đối với chúng.

Nhưng tôi sẽ tưởng tượng này có thể được làm chậm để xử lý

+0

Cảm ơn bạn sẽ thử điều này và cập nhật câu hỏi. Chúc mừng. – Johnny

0

Đó là một sự xấu hổ MS không bao giờ làm kiểu này điều đơn giản trong Access, bao nhiêu hàng được bạn làm việc với các báo cáo của bạn?

Nếu dưới 65K, tôi khuyên bạn nên đổ dữ liệu vào bảng tính Excel và sử dụng công thức đơn giản để tính toán khác nhau giữa các hàng.

+0

cảm ơn lời khuyên. Excel là một tùy chọn, nhưng tôi thực sự muốn sử dụng Access nếu có thể. Tôi có 65k + hồ sơ anyway, mặc dù tôi nghĩ rằng Excel 2010 có thể xử lý tối đa 1 triệu hàng bây giờ ... Tôi nghĩ. Johnny. – Johnny

+0

Đừng ngại sử dụng giải pháp này nếu đó là công việc sử dụng một lần trên tập dữ liệu mà máy tính của bạn có thể dễ dàng quản lý. Sử dụng một công cụ để sử dụng một công cụ khi một công cụ tốt hơn tồn tại là một sự tàn phá về thời gian của bạn – JustinJDavies

0

Bạn có thể thử một cái gì đó như sau (sql là chưa được kiểm tra và sẽ đòi hỏi một số thay đổi)

CHỌN

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

TỪ

( 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

Cảm ơn bạn đã dành thời gian trả lời. Rất tiếc, công cụ MS Access DB không thích 'ROW_NUMBER()'. Johnny. – Johnny