通过将表1中的字段中的数据与Access

时间:2016-02-08 00:05:09

标签: sql database vba ms-access access-vba

要点:

如何通过将表1字段A到表2字段A和表1字段B匹配到相应字段(B,C,D,E等),输出表2字段X中存储的表1中每行的数据。)在表2中?

这可能是令人作呕的简单所以如果您觉得我过度背景,请随意跳过其中一些内容!

使用案例

我继承了一个Access数据库,该数据库跟踪我公司聘请的承包商员工进行销售的个人销售旅行。我公司为每个承包商的所有员工协商了一个小时费率,用于我们公司的特定销售账户。

我有两个Access表:

1。 SalesTrips 包含承包商员工进行的所有销售旅行实例。

格式(仅限相关字段):

TripID     Sales Account     Contractor     Employee     Hours Contracted
1          800               EarthCO        Maurice      10
2          800               WindCO         Wade         36
3          900               FireCO         Don          17
4          800               FireCO         Sherry       52

2。合同包含我公司将向承包商员工支付的每个销售帐户的小时费率。

格式(仅限相关字段 - 费率为$ / hr):

Sales Account     EarthCO Rate     WindCO Rate     FireCO Rate
800               20               18              23
900               24               22              26

业务问题:

我的前任手动(阅读:在Excel中)为每次销售旅行计算了必要的付款,但没有证明某些员工由于病假而没有完成所有合同工时(但仍然支付了费用) 。所以,我建立了一个查询,从每个TripID的病假信息和输出的第三个表(SickLeave)中提取“工作小时数”。我们在查询“TrueHours”中将该字段称为“HoursWorked”。

对于每个TripID,我需要将SalesTrips表中的销售帐户和承包商与合同表上的销售帐户和承包商费率(选择正确的字段)相匹配。然后,显然,我需要将“HoursWorked”数量(来自我的查询的输出,并经常根据SickLeave表中的条目更新)乘以正确的支付率(协商,静态,并存储在Contracts表中)。 / p>

示例输出:

我想知道我们需要向EarthCO支付200美元的Maurice和FireCO的雪利酒1,196美元(他们没有病假)。

我认为:

  1. 使用SalesTrips表中与Sales Account和Contractor匹配的查找字段。但我不喜欢这个选项,因为我不太喜欢在SalesTrips表中存储速率的想法,并希望限制此表上的查找字段以实现与其他系统的互操作。

  2. 在查询中使用IIF语句或DLookup,但我很难将SalesTrips表中字段中的条目(例如“WindCO”)与字段本身匹配(例如“EarthCO Rate”)在合同表上。

  3. 我的访问和SQL经验非常有限,我的前任显然也是如此,所以尽管经过了数小时的研究,我仍然相对失去了这一点。这令人沮丧,因为我完全理解这在Excel中是如何工作的,而不是在关系数据库中。我更喜欢查询或类似的选项,并希望避免重组任何一个表,尽管如果有必要,我会对它持开放态度。

    作为长期的SO搜索者和第一次发布的海报,我希望你们都能帮忙解决这个问题!

1 个答案:

答案 0 :(得分:0)

我会重新考虑您的数据库设计。

Table 1确定

Table 2 定义包含'数据的字段并不是一个好主意。在字段名称中:它就像在程序的源代码中硬编码客户端名称。

尝试使用更多关系方法,定义3个字段:

Sales Account
Contractor
Rate

Sales Account     Contractor     Rate
800               EarthCO         20
800               WindCO          18
800               FireCO          23
900               EarthCO         24
900               WindCO          22
900               FireCO          26

这样您就可以使用如下查询构建一个将Table1连接到Table2的查询:

SELECT Table1.Employee, Table2.Rate, Table1.[Hours Contracted], 
[Rate]* [Hours Contracted] AS Total 
FROM Table1 INNER JOIN Table2 
ON (Table1.Contractor = Table2.Contractor) AND (Table1.[Sales Account] = Table2.[Sales Account]);

结果将是(包含您的数据):

Employee    Rate    Hours Contracted        Total
Maurice         20          10                   200
Wade            18          36                   648
Don             26          17                   442
Sherry          23          52                  1196

希望这有帮助