MS Access帮助需要形成特定报告

时间:2019-01-19 05:16:58

标签: ms-access

我有一个表格,其中包含一列代理商名称,以及一列代理商可能具备的每种技能。分配给代理的每个技能在该技能下的字段中均显示为1。

列如下所示:

+---------+----------+----------+----------+
|  Name   | 'Skill1' | 'Skill2' | 'Skill3' |
+---------+----------+----------+----------+
| John    |        1 |          |        1 |
| Sam     |        1 |        1 |          |
| Roberta |        1 |          |        1 |
+---------+----------+----------+----------+

我想查询一个返回所有座席名称的列表,这些名称的每个特定技能都为1。查询将返回如下内容:

+-----------+
| Skill 1   |
+-----------+
| John      |
| Sam       |
| Roberta   |
+-----------+

此外,我希望能够查询一个名称,并检索座席具有的所有技能(“名称”列的所有行均具有1英寸),如下所示:

+-----------+
|  John     |
+-----------+
| Skill 1   |
| Skill 3   |
+-----------+

我已经在Excel中使用索引完成了此操作,但是我是Access的新手,并且不确定如何完成此任务。

谢谢。

2 个答案:

答案 0 :(得分:1)

您发现此任务很困难的原因之一是因为您的数据库不是normalised,所以由于数据库的结构方式,您正在使用MS Access,而不是使用它。

>

因此,尽管仍然可以对当前数据进行解决,但生成的查询将很痛苦,并且可能充满了多个混乱的iif语句或几个执行相同查询的union查询一遍又一遍地操作,每个“技能”一个。

然后,如果您每个人都希望向数据库中添加其他技能,则必须重写所有查询!

相反,如果您的数据库被归一化(如古斯塔夫在评论中所建议),那么任务将是简单的一线工作;而且,如果以后添加新技能,您的查询将自动输出结果,就像该技能一直存在一样。


您的数据具有多对多关系:一个业务代表可能具有许多技能,并且一种技能可能为许多业务代表所了解。

因此,表示这种关系的最合适方法是使用junction table

因此,您将拥有一个Agent表,例如:

tblAgents

+-----+-----------+----------+------------+
| ID  | FirstName | LastName |    DOB     |
+-----+-----------+----------+------------+
|   1 | John      | Smith    | 1970-01-01 |
| ... | ...       | ...      | ...        |
+-----+-----------+----------+------------+

这将仅包含每个代理特有的信息,即,使表中记录之间的重复信息最小化。

然后,您将有一个可能的技能表,例如:

tblSkills

+-----+---------+---------------------+
| ID  |  Name   |     Description     |
+-----+---------+---------------------+
|   1 | Skill 1 | Skill 1 Description |
|   2 | Skill 2 | Skill 2 Description |
| ... | ...     | ...                 |
+-----+---------+---------------------+

最后,您将拥有一个连接表,将特工链接到技能,例如:

tblAgentSkills

+----+----------+----------+
| ID | Agent_ID | Skill_ID |
+----+----------+----------+
|  1 |        1 |        1 |
|  2 |        1 |        2 |
|  3 |        2 |        1 |
|  4 |        3 |        2 |
+----+----------+----------+

现在,假设您想找出哪些代理具有Skill 1,查询很简单:

select Agent_ID from tblAgentSkills where Skill_ID = 1

如果您想找出代理商已知的技能怎么办?同样简单:

select Skill_ID from tblAgentSkills where Agent_ID = 1

当然,这些查询将仅返回联结表中显示的ID字段-但由于ID 唯一标识tblAgents或{{ 1}}表中,您只需检索此类ID,即可获取其他所有必需信息:

tblSkills

答案 1 :(得分:0)

要获取所有具有skill1的代理,请打开查询设计器并创建以下查询: enter image description here

这将生成以下sql

SELECT Skills.AgentName 来自技能 在哪里((((Skills.Skill1)= 1));

如果调整名称,还可以将此查询粘贴到设计器的sql窗格中,以获取所需的查询。 为了获得座席拥有的所有技能,我选择了参数化查询。打开查询设计器并创建一个新查询: enter image description here

运行此查询时,它将询问您代理的名称。确保准确键入代理名称。这是生成的sql:

选择Skills.AgentName,Skills.Skill1,Skills.Skill2,Skills.Skill3 来自技能 在哪里((((Skills.AgentName)= [Agent])));

如果您继续使用此查询,我将通过将表分为技能表,特工表,技能和特工表来改进表设计。然后以多对多关系将技能和代理表链接到技能和代理表。在设计器中,获取所有座席技能的查询将如下所示:

enter image description here