我在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查询?
答案 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引擎的健壮性。