使用 MS Access 2010,编辑一个表单,3 个表,一个表是“一对多”,并且希望在一行中进行查询

Posted

技术标签:

【中文标题】使用 MS Access 2010,编辑一个表单,3 个表,一个表是“一对多”,并且希望在一行中进行查询【英文标题】:using MS Access 2010, editing a form, 3 tables, one table is "one to many" and want to have query across one row 【发布时间】:2013-11-05 20:42:23 【问题描述】:

示例: (使用逗号,显示列和“A_”,“B_”,“C_”显示表) 我目前有...

A_John、A_Doe、B_MemStartDate、C_Date,

A_John、A_Doe、B_MemStartDate、C_Date,

A_John、A_Doe、B_MemStartDate、C_Date,

我希望表“C”列由课程拉出,但显示为“日期”列...换句话说,例如,课程 = 1,使用日期...等...

该表将包含每个成员的课程历史记录。

会员 ID、课程 ID、日期

JohnDoe,课程 1,10-10-13

JohnDoe,课程 2,10-11-13

JohnDoe,Course3,10-12-13

当然,表 C 是一对多的,目的是显示课程的日期,因为我会用我想要显示的 3 个不同的课程来命名列...(我只想拉3 种不同的课程)

我想把它们排成一排...

A_John、A_Doe、B_Start Date、C_Course1Date、C_Course2Date、C_Course3Date

抱歉,我的问题缺乏经验,但我通常会通过“复制/粘贴”来解决...哈哈

记住我正在使用 Access... 我可以这样做吗?


澄清...抱歉不知道如何在基本 html 中制作表格,所以有逗号

有这个。从 3 个不同的表中提取,其中成员# 是唯一的并已加入。

会员开始日期状态课程课程日期 JohnSmith, 08-01-2013, 活跃, Workshop1, 10-20-2013 JohnSmith, 08-01-2013, 活跃, Workshop2, 10-13-2013 JohnSmith, 08-01-2013, 活跃, Workshop3, 10-28-2013 LaraBentt,2012 年 1 月 12 日,不活动,Workshop1,2012 年 2 月 20 日 LaraBentt,2012 年 1 月 12 日,不活动,Workshop2,2012 年 2 月 13 日 LaraBentt,2012 年 1 月 12 日,不活动,Workshop3,2012 年 2 月 28 日

想要这个...

会员开始日期状态WORKSHOP1WORKSHOP2WORKSHOP3 约翰史密斯,2013 年 8 月 1 日,活跃,2013 年 10 月 20 日,2013 年 10 月 13 日,2013 年 10 月 28 日 LaraBentt,2012 年 12 月 1 日,不活动,2012 年 2 月 20 日,2012 年 2 月 13 日,2012 年 2 月 28 日

表格列基本是这样的... 表 1 - tblMember(一对一)MEMBERSTARTDATE 表 2 - tblRegStatus(一 - 一)MEMBERSTATUS 表 3 - tblCourses(一对多)MEMBERCOURSECOURSEDATE

希望这能更好地解释它!

【问题讨论】:

最好解释一下三个表中的每个字段,一次一个,然后解释你想要的结果。当您找不到解释的词时,使用示例数据可以使事情变得清晰。我花时间回答了我认为您要问的问题-如果不是您要问的问题,我可以调整答案-但我认为这比让您的问题无人回答要好...更好开始对话 同意,但我不是程序员也不是数据库人。我认为可以在这方面询问...如果我错了,请告诉我。您确实了解它,我将尝试通过您发送的链接中的 Access 来执行此操作。哦,是的,感谢您的帮助。 :) 你可以在这方面问。可以咨询***.com/help/on-topic 或***.com/help/how-to-ask 进行澄清。不要担心您的经验水平 - 我们都从某个地方开始。我认为您的问题与该领域非常相关-只是不清楚您的要求是什么-含糊不清。我的建议是/是写出示例数据。显示您拥有的数据(列出表名称和字段名称),以及您希望最终得到的数据(显示字段)。看看我的回答,看看我是如何列出我们开始和结束的数据的。 刚刚试图“澄清”...让我知道从初学者的角度来说这是否是一种更好的解释方式? 是的好多了。我已经更新了我的答案。让我知道这是否是你所追求的 【参考方案1】:

您对问题的修改使问题更加清晰。

您将遇到的一个问题是,如果您有人注册了同一门课程两次。必须理解,您只显示每人最近的注册信息。现在我们了解了这个警告 - 让我们看看如何构建它。

最简单的构建方法是将查询类型从 Select 更改为 Crosstab。这是通过 Access 接口完成的。

对于查询中的每个字段,将总计和交叉表值设置为:

MemberName:   Total = *Group By*   Crosstab = *Row Heading*
StartDate:    Total = *Group By*   Crosstab = *Row Heading*
Status:       Total = *Group By*   Crosstab = *Row Heading*
CourseName:   Total = *Group By*   Crosstab = *Column Heading*
CourseDate:   Total = *Max*        Crosstab = *Value*

这会产生如下查询结果:

MemberName  StartDate   Status     Biology     English        Math
----------  ---------   ------     -------     -------        ----
John        10/1/2013   Active                 11/14/2013     12/1/2013
Matthew     9/1/2013    Inactive   1/1/2013     
Peter       8/7/2013    Active     1/1/2013    4/1/2013 
Sam         1/14/2013   Inactive               11/14/2013   
William     5/19/2013   Active     1/1/2013    4/1/2013 

交叉表的优点是它会在有数据时自动添加列。 但是,您必须构建查询(联接)才能为您提供所需的数据。例如 - 您想显示列表中没有课程的成员吗?是否要显示没有注册的课程?

Microsoft 有一个关于使用交叉表查询的页面:

http://office.microsoft.com/en-us/access-help/make-summary-data-easier-to-read-by-using-a-crosstab-query-HA010229577.aspx

如果您想对您的三列进行硬编码,您还可以手动旋转数据。再次提醒 - 请记住,我们使用的是 Max 聚合,因此只会显示最新的课程。使用手动数据透视,您还需要记住它仅限于您请求的数据。

选择查询,右键单击并单击“总计”以显示总计行。您还可以单击查询工具/设计下功能区中的总计图标。 设置您的三列:

MemberName:   Total = *Group By*
StartDate:    Total = *Group By*
Status:       Total = *Group By*

现在为您希望包含的每门课程添加一个单独的字段。在“字段”定义中输入以下内容。

Science: IIf([CourseName]="Science",[CourseDate],Null)
Biology: IIf([CourseName]="Biology",[CourseDate],Null)
Math: IIf([CourseName]="Math",[CourseDate],Null)
English: IIf([CourseName]="English",[CourseDate],Null)

将“Total”定义值设置为“Max”。

这应该会为您提供您正在寻找的结果。

【讨论】:

以上是关于使用 MS Access 2010,编辑一个表单,3 个表,一个表是“一对多”,并且希望在一行中进行查询的主要内容,如果未能解决你的问题,请参考以下文章

VBscript 在 MS Access 2010 中制作问卷表格

使用表单过滤交叉表查询 MS Access 2010

MS Access ADP 断开连接的记录集恢复

MS Access 2010:是不是可以链接数据表子表单

ms access 2010 中的主详细信息子表单

MS Access 2010 运行时 - 连续表单中缺少鼠标右键单击上下文菜单