ACC: 如何创建组查询每一个上限 N 值

文章翻译 文章翻译
文章编号: 153747 - 查看本文应用于的产品
中等: 要求基本的宏、 编码,和互操作技能。
展开全部 | 关闭全部

本文内容

概要

本文向您介绍可用于创建每个组的列表仅顶端的 N 项的查询的两种方法。通过这些方法中的任何一个您可以创建一个查询,例如对于只在前五位销售的每个区域显示的。

本文中介绍的第二种方法假定您熟悉 Visual Basic 应用程序的使用和创建 Access 应用程序使用提供的 Microsoft Access 的编程工具。 有关 Visual Basic 应用程序的详细信息,请参阅您构建应用程序与 Microsoft 访问手册的版本。

更多信息

若要列出仅前 N 项在查询中的组中,必须指定一个条件动态地读取在查询中的分组列,并限制项目列顶部的 N 值在每个组中。方法 1 使用 SQL 子查询动态生成的每个组顶端的 N 项的列表,然后作为条件使用 IN 运算符的项列,使用此列表。方法 2 使用用户定义函数来返回该第 n 个项目,然后使用与某个特定组内的,> = 运算符将返回 Nth 和更大的项目。

方法 1

下面的示例演示如何在显示库存量将前的三个每类别 id 的罗斯文示例数据库中创建一个查询。 该查询使用返回库存量将前三个给出特定的类别 id,一个 SQL 子查询,然后使用限制在主查询中的记录的 IN 运算符。

注: 在第 5 步中该条件示例在行尾处的下划线 (_) 用作行继续符。重新创建条件时,可以从行的末尾删除下划线。

  1. 打开示例数据库 Northwind.mdb。
  2. 单击查询选项卡,然后单击新建。
  3. 单击设计视图,然后单击确定。
  4. 显示表对话框中添加类别和产品表,然后单击关闭。
  5. 将以下字段添加到查询设计网格中:
    字段: 类别名称
    排序: 升序

    字段: 产品名称

    字段: 库存量
    排序: 降序
    条件: 在 (选择来自产品的前 3 [库存量] Where _
    [类别 id] = [类别] [类别 id] [库存量] 降序按的顺序)
  6. 运行该查询。请注意该查询将返回库存量将前的三个为每个类别。

方法 2

下面的示例演示如何在显示每个客户所下最后五个订单的罗斯文示例数据库中创建一个查询。 该查询使用一个标准函数,称为 NthInGroup() 返回给出特定的客户 id 在第五步是最新订购日期。使用该 > = 运算符一起使用此函数返回了为每个客户订购或第五步是最新订购日期之后的所有订单:

  1. 打开示例数据库 Northwind.mdb。
  2. 创建一个新的模块,并将以下行添加到该声明节如果它已不存在:
    显式的选项
  3. 创建以下过程:
          Function NthInGroup(GroupID, N)
          ' Returns the Nth Item in GroupID for use as a Top N per group
          ' query criteria.
          Static LastGroupId, LastNthInGroup
          Dim ItemName, GroupIDName, GDC, SearchTable
          Dim SQL As String, rs As Recordset, db As DATABASE
    
          If (LastGroupId = GroupID) Then
             ' Returned saved result if function is called with the
             ' same GroupID more than once in a row.
             NthInGroup = LastNthInGroup
          Else
             ' Set the SQL statement parameters. These are the only items
             ' that need to be customized in this function.
             ' Set to Item field name.
             ItemName = "OrderDate"
             ' Set to Group ID field name.
             GroupIDName = "CustomerID"
             ' GroupID Delimiter Character:
             ' For Text use "'" (Note that this is a quotation mark, a space,
             ' an apostrophe, a space, and then a quotation mark. The spaces
             ' are necessary for SQL statements), Date "#", Numeric ""
             GDC = "'"
             ' Set to search table.
             SearchTable = "Orders"
             ' Build a Top N SQL statement dynamically given N and
             ' GroupID as parameters. Note that the sort is by the
             ' item in descending order, in order to get the Top N
             ' largest items.
             SQL = "Select Top " & N & " [" & ItemName & "] "
             SQL = SQL & "From [" & SearchTable & "] "
             SQL = SQL & "Where [" & GroupIDName & "]=" & GDC & GroupID & GDC _
                & " "
             SQL = SQL & "Order By [" & ItemName & "] Desc"
             ' Open up recordset on Top N SQL statement and read the
             ' last record to get the smallest item in the Top N.
             Set db = CurrentDb()
             Set rs = db.OpenRecordset(SQL)
             If (rs.BOF And rs.EOF) Then
                ' No matches found, return a null.
                LastNthInGroup = Null
                LastGroupId = GroupID
                NthInGroup = LastNthInGroup
                Else
                   ' Return the smallest Top N item in the group.
                   rs.MoveLast
                   LastNthInGroup = rs(ItemName)
                   LastGroupId = GroupID
                   NthInGroup = LastNthInGroup
                 End If
              End If
    
           End Function
    						
  4. 编译模块,然后关闭并保存为 basTopN 的模块。
  5. 单击查询选项卡,然后单击新建。
  6. 单击设计视图,然后单击确定。
  7. 显示表对话框中添加该客户和订单表。 单击关闭。
  8. 将以下字段添加到查询设计网格中:
    字段: 客户 id
    排序: 升序


    字段: 订单 id

    订购日期字段:
    排序: 降序
    标准: > = NthInGroup([Customers].[CustomerID],5)
  9. 运行该查询。请注意所有具有至少包含 5 个订单的客户,该查询将返回五个最新的订单。对于少于五份订单的客户查询返回所有订单。

参考

有关子查询的详细信息,搜索 子查询,然后使用 Microsoft Access 97 帮助索引的 SQL 子查询

属性

文章编号: 153747 - 最后修改: 2007年1月19日 - 修订: 3.3
这篇文章中的信息适用于:
  • Microsoft Access 95 标准版
  • Microsoft Access 97 标准版
关键字:?
kbmt kbhowto kbprogramming KB153747 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 153747
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com