Ms access 使用;总数;已分组查询上的函数
在查询中使用Ms access 使用;总数;已分组查询上的函数,ms-access,Ms Access,在查询中使用groupby等功能时,使用聚合函数时遇到问题。与应用于整个查询记录集的聚合函数不同,它们只应用于由查询性质确定的选定组。例如: Person Date Able ----------------------------- A 21/05/13 0 B 21/05/13 -1 C 21/05/13 -1 D 21/05/13 0 (grouped b
groupby
等功能时,使用聚合函数时遇到问题。与应用于整个查询记录集的聚合函数不同,它们只应用于由查询性质确定的选定组。例如:
Person Date Able
-----------------------------
A 21/05/13 0
B 21/05/13 -1
C 21/05/13 -1
D 21/05/13 0
(grouped by Person, Date, Able)
应用聚合函数时:
Person Date Able Max(Able) Min(Date)
----------------------------------------------------
A 21/05/13 0 0 21/05/13
B 22/05/13 -1 -1 22/05/13
C 23/05/13 -1 -1 23/05/13
D 24/05/13 0 0 24/05/13
聚合函数是完全冗余的,除非数据完全解组。到目前为止,我一直在使用:
1) 使用另一个查询引用初始查询并确定真正的聚合值。
2) 让表单使用d
函数(dlookup
,dcount
等)调用第二个查询
在我的特定场景中,我有一个列表(非常类似于上面的列表),需要按照特定的顺序(基于ID排序)显示。但是,我在查询中使用了一个表达式来定义不同类型的排名。其思想是显示(使用条件格式)这个新列组中的第一条记录。如下图所示
Person Date ID CalculatedRank
--------------------------------------------
A 21/05/13 1 4
B 21/05/13 2 2
C 21/05/13 3 3
D 21/05/13 4 1
理想情况下,我希望有另一个专栏来确定哪一个是第一个,可以通过以下方式轻松实现:
first: [CalculatedRank] = Min( [CalculatedRank] )
但是如上所述,Min()并没有给我1,而是在每行的基础上给我(minimum并不总是1,所以我不能随意设置)
现在我使用一个单独的查询来引用第一个查询,并根据计算出的排名对其进行排序。然后,条件格式可以使用dlookup从第二个查询确定它是否是第一个查询。但是,每当表单刷新或调用重新查询时,每一行的条件格式都会触发另一个dlookup,然后它会引用第一个查询,为每一行重新计算新的秩
正如您可以想象的那样,延迟是明显的,导致光标空闲>5秒。我不太确定访问的内部机制,但使用内置调试器,对4行记录集的重新查询导致调用我的CalculateRank()
函数12次,完全是通过调用第二个查询的条件格式
总之,我已经将范围缩小到需要一个单独的查询(因此需要dlookup)来正确使用聚合函数。如果我能够在一个查询中保存所有内容,那么条件格式就不需要在另一个查询中使用dlookup来确定其状态
我确信我不是唯一一个对此有问题的人,我想知道是否存在任何解决方案,我可以避免所有的堆叠查询
一如既往,我们非常感谢您的帮助 哇,我明白你的意思了!我的桌子[表1]
Person Date ID
------ ---------- --
A 2013-05-21 1
B 2013-05-21 2
C 2013-05-21 3
D 2013-05-21 4
和我的查询[qryTable1Ranked]
SELECT Table1.*, CalculateRank([ID]) AS CalculatedRank
FROM Table1;
在标准VBA模块中使用以下功能的
Public Function CalculateRank(ID As Long) As Long
Dim r As Long
Select Case ID
Case 1
r = 4
Case 4
r = 1
Case Else
r = ID
End Select
CalculateRank = r
Debug.Print "x"
End Function
返回
Person Date ID CalculatedRank
------ ---------- -- --------------
A 2013-05-21 1 4
B 2013-05-21 2 2
C 2013-05-21 3 3
D 2013-05-21 4 1
当我双击查询在数据表视图中打开它时,我的排名函数会被调用4次,每行调用一次
如果我基于该查询创建一个连续表单并打开该表单,我的函数将被调用4次。然后,如果我使用Value=DMin(“CalculatedRank”,“qryTable1Ranked”)
在[CalculatedRank]文本框中添加条件格式,那么我的函数将被调用32次
我发现,如果我添加一个名为[txtMinCalculatedRank]的不可见的未绑定文本框,使用表单后面的以下代码,我可以将其减少一半(到16倍)
Option Compare Database
Option Explicit
Private Sub Form_Load()
UpdateMinCalculatedRank
End Sub
Private Sub UpdateMinCalculatedRank()
Me.txtMinCalculatedRank.Value = DMin("CalculatedRank", "qryTable1Ranked")
End Sub
…并将条件格式规则更改为Value=[txtMinCalculatedRank]
我发现如果我将表单的记录源
从qryTable1Ranked
更改为Table1
(基本表),并将[CalculateRank]文本框的控制源
更改为=CalculateRank([ID])
(仍在使用上一次调整中的技巧)
我认为这可能是最好的,不用创建一个临时表,也不用在基表中持久化CalculatedBank(可能还有一个“IsMin”标志)。哇,我明白你的意思了!对于我的表[表1]
Person Date ID
------ ---------- --
A 2013-05-21 1
B 2013-05-21 2
C 2013-05-21 3
D 2013-05-21 4
和我的查询[qryTable1Ranked]
SELECT Table1.*, CalculateRank([ID]) AS CalculatedRank
FROM Table1;
在标准VBA模块中使用以下功能的
Public Function CalculateRank(ID As Long) As Long
Dim r As Long
Select Case ID
Case 1
r = 4
Case 4
r = 1
Case Else
r = ID
End Select
CalculateRank = r
Debug.Print "x"
End Function
返回
Person Date ID CalculatedRank
------ ---------- -- --------------
A 2013-05-21 1 4
B 2013-05-21 2 2
C 2013-05-21 3 3
D 2013-05-21 4 1
当我双击查询在数据表视图中打开它时,我的排名函数会被调用4次,每行调用一次
如果我基于该查询创建一个连续表单并打开表单,我的函数将被调用4次。如果我使用Value=DMin(“CalculatedRank”,“qryTable1Ranked”)
在[CalculatedRank]文本框中添加条件格式,那么我的函数将被调用32次
我发现,如果我添加一个名为[txtMinCalculatedRank]的不可见的未绑定文本框,使用表单后面的以下代码,我可以将其减少一半(到16倍)
Option Compare Database
Option Explicit
Private Sub Form_Load()
UpdateMinCalculatedRank
End Sub
Private Sub UpdateMinCalculatedRank()
Me.txtMinCalculatedRank.Value = DMin("CalculatedRank", "qryTable1Ranked")
End Sub
…并将条件格式规则更改为Value=[txtMinCalculatedRank]
我发现如果我将表单的记录源
从qryTable1Ranked
更改为Table1
(基本表),并将[CalculateRank]文本框的控制源
更改为=CalculateRank([ID])
(仍在使用上一次调整中的技巧)
我认为这可能是最好的,不必创建临时表,也不必持久化CalculatedBank(可能还有一个“IsMin”标志)在基本表中。Gord,很抱歉回复太晚。我希望花些时间看看是否可以使用您的技巧和我已经有的一些技巧来进一步减少它,但我没有成功。我希望有某种调用堆栈是可见的,这样我就可以确定条件格式在何时以及为什么会多次重新查询。我想ess这可能是access未来版本中必须解决的问题。再次感谢您的努力和投入。Gord,很抱歉延迟回复。我希望花一些时间看看是否可以使用