访问SQL如何在SELECT查询中进行增量

时间:2011-06-09 14:24:25

标签: sql ms-access select counter

我有一个SQL查询给我X结果,我希望查询输出有一个coulmn调用 计数这样的查询:

count id section
1     15    7
2     3     2
3     54    1
4     7     4

我怎样才能实现这一目标?

6 个答案:

答案 0 :(得分:2)

所以在你的例子中,“count”是派生的序列号?我没有看到用什么模式来确定id = 15时的计数必须为1,id = 3时计数必须为2.

count id section
1     15    7
2     3     2
3     54    1
4     7     4

如果id包含唯一值,并且您按ID排序,则可以这样:

count id section
1     3     2
2     7     4
3     15    7
4     54    1

在我看来,mikeY的DSum方法可行。或者您可以使用不同的排名查询方法,正如Allen Browne所描述的at this page

修改:您可以使用DCount代替DSum。我不知道两者之间的速度如何比较,但DCount避免在表格中创建一个字段,只是为每行存储1个。

DCount("*","YourTableName","id<=" & [id]) AS counter

无论您使用DCount还是DSum,如果id值不唯一,计数器值可以包含重复项。如果id是主键,不用担心。

答案 1 :(得分:2)

我坦率地不明白你想要什么,但如果你想要的只是表单上显示的序列号,你可以使用绑定到表单的CurrentRecord属性的控件。具有ControlSource =CurrentRecord的控件将具有始终准确的“记录编号”,该记录编号按顺序排列,并且将在表单的Recordsource更改时更新(可能需要也可能不需要)。

如果愿意,您可以使用该号码在表单中导航。

但这可能与你所寻找的不一样 - 我根本无法从你发布的问题和评论中的“澄清”中说出来。

答案 2 :(得分:1)

我见过的唯一技巧是,如果你有一个顺序id字段,你可以创建一个新字段,其中每个记录的值为1.然后你执行该字段的运行总和。

添加到您的查询

DSum(“[其中包含1的新字段]”,“[表名称]”,“[ID字段]&lt; =”&amp; [ID字段])作为反击

那应该在Access中产生一个我认为你想要的顺序计数。

HTH。

(Rob Mills从这里偷来的: http://www.access-programmers.co.uk/forums/showthread.php?p=160386

答案 3 :(得分:1)

好吧,我想这足以构成一个答案:以下链接指定了两种方法:http://www.techrepublic.com/blog/microsoft-office/an-access-query-that-returns-every-nth-record/

第一种方法假设您有一个ID值并使用DCount(类似于@mykey的解决方案)。

第二种方法假设您可以创建一个VBA函数,该函数将为记录集中的EACH记录运行一次,并且每次要运行计数时都需要手动重置(使用某些VBA) - 因为它使用一个“静态”值来运行它的计数器。

只要你有合理的数字(数百,而不是数千)或记录,第二种方法看起来对我来说最简单/最强大。

答案 4 :(得分:0)

您可以使用SQL Server 2008中的ROW_NUMBER()

SELECT ROW_NUMBER() OVER (ORDER By ID DESC) RowNum,
    ID,
    Section
FROM myTable

然后RowNum显示行号序列。

答案 5 :(得分:0)

如果可以从模块中获取,则可以从每条记录中调用此函数。

示例:incrementingCounterTimeFlaged(10,[anyField])应该为您的查询行提供从0开始递增的int。

'provides incrementing int values 0 to n
'resets to 0 some seconds after first call
Function incrementingCounterTimeFlaged(resetAfterSeconds As Integer,anyfield as variant) As Integer

Static resetAt As Date
Static i As Integer
'if reset date < now() set the flag and return 0

If DateDiff("s", resetAt, Now()) > 0 Then
    resetAt = DateAdd("s", resetAfterSeconds, Now())
    i = 0
    incrementingCounterTimeFlaged = i
'if reset date > now increments and returns
Else
    i = i + 1
    incrementingCounterTimeFlaged = i
End If    
End Function