MS Access - 汇总时间段数据(VBA或SQL?)

时间:2015-08-17 21:09:04

标签: sql excel vba excel-vba ms-access

我在Access(2010)表中有一组时间分段数据。有3个级别,帐户(1),包(2),元素(3)。每行都有帐户,包裹,元素以及时间段和金额。我希望能够进行滚动,这样我就可以看到每个级别的当前时段和总数(Account的一个输出,Package的一个输出,Element的一个输出)并将这些不同的级别保存为他们自己的表(或者只输出回excel)。

所以,如果我有这些数据:

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

我想按元素推送它来获取此表(如果当前是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

然后按元素滚动以获取此信息:

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

一个明显的问题是一个未规范化的表,但我是从客户提供的excel文件中导入这些数据。我确实使用大量的SUMIF在Excel中成功创建了这个,但我接近500k行,它只是开始锁定我。

我以为我会看到Access是否会工作quicer.So如果我只有一个表,我尝试循环通过Account然后包然后元素并做一个比较Period to Current和计算总和。

是否有更好的方法而不是打开一堆记录集 - 使用创意SQL查询?

1 个答案:

答案 0 :(得分:1)

只需使用一个表通过查询运行聚合组。唯一的挑战是需要删除其他描述符或使用聚合运行。例如,下面我使用了Max()

按元素

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

仅限于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

纯粹由元素

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

按帐户

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

按包

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

最后,许多Excel函数都有SQL对应项,包括SumIf()CountIf()VLookup()Index()Match()。对于500K行,请考虑使用Access的默认SQL引擎的健壮性。