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

Access(2010)表中有一组时间分段的数据。 有3个级别,帐户(1),包(2),元素(3)。 每一行都有“帐户”,“包”,“元素”以及时间段和金额。 我希望能够推出这个function,以便我可以看到每个级别的当前时段和总计(帐户的一个输出,一个用于包,一个用于元素),并将这些不同的级别保存为自己的表(或只是输出回到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中成功创build了这个function,但是我已经接近500k行,并且开始对我进行locking。

我以为我会看看如果Access将工作quicer.So如果我只有一个表,我试着循环通过帐户然后包装然后元素,做一个比较期间当前和计算总和。

有没有更好的方式,而不是打开一堆logging集 – 使用创造性的SQL查询?

只需通过查询使用一个表运行聚合组。 唯一的挑战是其他的描述将需要删除或运行一个聚合。 例如,下面我使用了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()CountIf() VLookup()Index()Match() 。 对于500K行,考虑使用Access的默认SQL引擎的健壮性。