简体   繁体   中英

MS Access - Roll-up Time-phased data (VBA or SQL?)

I have a set of time-phased data in an Access (2010) table. There are 3 levels, Account (1), Package (2), Element (3). Each row has the Account, Package, Element along with a time Period and dollar amount. I want to be able to roll-this up so I can see what the current period and totals are at each level (one output for Account, one for Package, and one for Element) and save those different levels as their own tables (or just output back to excel).

So if I have this data:

Account  Package  Element  Period  Dollars
A          11        X      2010      5
A          11        O      2010      5
A          11        X      2011      5
B          44        X      2010      5
B          52        O      2010      5
B          44        L      2011      5 
C          24        X      2011      5
C          14        L      2011      5
C          14        L      2011      5
C          14        L      2010      5

I want to roll it up by element to get this table (if current is 2010)

Account  Package  Element  Current  Total
A          11        X       5        5
A          11        O       5        0
B          44        X       5        5
B          52        O       5        0
C          24        X       0        5
C          14        L       5        10

and then roll-it up by element to get this:

Account  Package  Current  Total
A          11        10       5
B          44        5        5
B          52        5        0
C          24        0        5
C          14        5        10

An obvious problem is one table that isn't normalized, but I'm importing this data from an excel file given by a customer. I did create this successfully in Excel using a lot of SUMIFs, but I'm close to 500k rows and it just starts locking up on me.

I'd thought I'd see if Access would work quicer.So If I have just the one table, I tried looping through Account then Package then Element and doing a compare Period to Current and calculating sums.

Is there a better way instead of opening a bunch of recordsets - to use creative SQL queries?

Simply run aggregate group by queries using the one table. The only challenge is the other descriptives will need to be removed or run with an aggregate. As example, below I used Max() .

By Element

SELECT Max(Account) As MaxOfAccount,  Max(Package) As MaxOfPackage, 
       Element, Sum(IIF(Period=2010,1,0)) As Current, Sum(Dollars) As TotalDollars 
FROM TimePhasedData
GROUP BY Element

By Element for only 2010:

SELECT Max(Account) As MaxOfAccount,  Max(Package) As MaxOfPackage, 
       Element, Count(Period) As Current, Sum(Dollars) As TotalDollars 
FROM TimePhasedData
WHERE Period = 2010
GROUP BY Element

Purely by Element

SELECT Element, Sum(IIF(Period=2010,1,0)) As Current, Sum(Dollars) As TotalDollars 
FROM TimePhasedData
GROUP BY Element

By Account

SELECT Account,  Max(Package) As MaxOfPackage,  Max(Element) As MaxOfElement,  
       Sum(IIF(Period=2010,1,0)) As Current, Sum(Dollars) As TotalDollars
FROM TimePhasedData
GROUP BY Account

By Package

SELECT Max(Account) As MaxOfAccount,  Package,  Max(Element) As MaxOfElement,  
       Sum(IIF(Period=2010,1,0)) As Current, Sum(Dollars) As TotalDollars 
FROM TimePhasedData
GROUP BY Package

Finally, many Excel functions have their SQL counterparts including SumIf() , CountIf() , VLookup() , Index() , Match() . And with 500K rows, consider the robustness of using Access' default SQL engine.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM