Link to home
Start Free TrialLog in
Avatar of sz14
sz14

asked on

Moving-average for nested tables in Access 2013

Hello,

I have a table which resembles the following:

-------------------------------------------
ItemID  |  BuyDate |     Cost
-------------------------------------------
1       | 1/1/2014 |    $25.00
2       | 1/1/2014 |    $29.40
3       | 1/1/2014 |    $50.80
4       | 2/1/2014 |    $16.70
5       | 3/1/2014 |    $48.50
6       | 3/1/2014 |    $34.70
.
.

Open in new window


I intend to calculate the 5-day moving average for the above data. My SQL code in Access 2013 resembles the following:

SELECT B1.BuyDate AS Buy_Date, SUM(B1.Costs) AS Total_Costs, (
        SELECT Avg(B2.CostSum)
        FROM 
                (SELECT U3.BuyDate as BDate, SUM(B3.Cost) as CostSum
                 FROM Bought AS B3
                 GROUP BY B3.BuyDate) AS B2
        WHERE
        B2.BDate BETWEEN DateAdd("d", -4, B1.BuyDate) AND B2.BDate
        GROUP BY B2.BDate
 ) AS [5-day_MovAvg]
FROM Bought AS B1
GROUP BY B1.BuyDate;

Open in new window


However, when I tried to run the code, a prompt popped-up in Access, stating that at most only one record can be returned.

Please advise on how I may be able to do this. My desired SQL output would be as follows:

--------------------------------------------------------
Buy_Date |Total_Costs| 5-day_MovAvg
--------------------------------------------------------
1/1/2014 |   $105.20 |  $105.20
2/1/2014 |    $16.70 |  $60.95
3/1/2014 |    $83.20 |  $68.37
.
.
.

Open in new window


Thanks.
SOLUTION
Avatar of Gustav Brock
Gustav Brock
Flag of Denmark image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of sz14
sz14

ASKER

Hi Gustav & Crystal,

Firstly, thank you very much for your prompt replies to my query. :)

Gustav, I have attempted to run your solution in Access 2013, but a prompt appears when I attempt to run this query, requesting for a parameter value to be entered for B1.BuyDate. This is strange as Access usually prompts the user for this input if the variable was not defined prior to execution of the SQL code, so Access prompts the user for a value to be entered at run-time.

Crystal, I have also tried to run your code in Access 2013. It seems that the MovAvg values are obtained by averaging the values for the day. So, for instance, the total costs for 1/1/2014 is $105.20, but the moving average was calculated to be $35.20 (which is incorrect, as it should be averaging the total sums on a daily basis, and not for individual entries in the table). Please see the attached screenshots for what happens when the code is run in Access 2013.

Please advise.

Thanks.

(P.S. BTW, there are a couple of typos in my question posted above:
1. The header for the third field of the table should read Costs, and not Cost.
2. In my code, it should read SELECT B3.BuyDate, and not U3.BuyDate.

I sincerely apologize for the typos. )
Crystal.JPG
Gustav.JPG
Try with the alias Buy_Date:

    HAVING B3.BuyDate BETWEEN DateAdd("d", -4, B1.Buy_Date) AND B1.Buy_Date)) AS

/gustav
ASKER CERTIFIED SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
thanks for sharing your solution -- glad you got it
Avatar of sz14

ASKER

The final solution which I provided solves the problem, but kudos to Gustav & Crystal who have provided a nudge in the right direction (through their code).