使用 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 日
想要这个...
会员、开始日期、状态、WORKSHOP1、WORKSHOP2、WORKSHOP3 约翰史密斯,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(一对一)MEMBER、STARTDATE 表 2 - tblRegStatus(一 - 一)MEMBER、STATUS 表 3 - tblCourses(一对多)MEMBER、COURSE、COURSEDATE
希望这能更好地解释它!
【问题讨论】:
最好解释一下三个表中的每个字段,一次一个,然后解释你想要的结果。当您找不到解释的词时,使用示例数据可以使事情变得清晰。我花时间回答了我认为您要问的问题-如果不是您要问的问题,我可以调整答案-但我认为这比让您的问题无人回答要好...更好开始对话 同意,但我不是程序员也不是数据库人。我认为可以在这方面询问...如果我错了,请告诉我。您确实了解它,我将尝试通过您发送的链接中的 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 个表,一个表是“一对多”,并且希望在一行中进行查询的主要内容,如果未能解决你的问题,请参考以下文章