1

我靠运气和胶带建立了一个数据库来处理一些员工数据。我每月收到一个包含以下字段的大型 Excel 电子表格:

员工编号、会计月份、项目代码、工作时间

我构建了查询/表来链接员工编号和员工姓名等内容。一切都很好。

我遇到的问题,这可能是因为除了一些 1 天的课程之外,我没有任何编程背景,我希望它在没有工作时间的情况下返回结果。

举一个具体的例子——假设我们有一个名为 Project Pasta 的项目。在三月份,没有人在 Project Pasta 上工作任何时间。但是,当我运行每个项目的所有工作时间的报告时,我希望 Project Pasta 在生成的电子表格的第二列中仍然显示为“0”。

我尝试了各种形式的左外连接,但我不知道如何获得“空”返回,我对 Access 和我自己感到非常恼火,我想我会哭求帮助。

我会回答任何人的任何问题,但我不能 100% 确定人们需要知道什么才能提供帮助。它是 Windows XP 上的 Microsoft Access 2007,物有所值。

谢谢!:)

我现在的查询按经理分组:

SELECT timeworked.fiscalmonth, 
       timeworked.projectcode, 
       kronoscodes.projectname, 
       SUM(timeworked.hoursworked) AS SumOfHoursWorked, 
       employees.manager 
FROM   employees 
       INNER JOIN ((kronoscodes 
                    INNER JOIN timeworked 
                            ON kronoscodes.projectcode = timeworked.projectcode) 
                   INNER JOIN months 
                           ON timeworked.fiscalmonth = months.fiscalmonth) 
               ON employees.[employee id] = timeworked.employeeid 
GROUP  BY timeworked.fiscalmonth, 
          timeworked.projectcode, 
          kronoscodes.projectname, 
          employees.manager 
HAVING (( ( timeworked.fiscalmonth ) LIKE "janfy13" )); 

列名是:

EmployeeID, 
ProjectCode, 
ProjectName, 
HoursWorked, 
FiscalMonth

所以基本上我希望每个财政月的每个项目代码都回来,即使在我导入的数据中“工作时间”下没有任何内容。

4

1 回答 1

1

考虑以下示例数据:

Table: timeworked
employeeid  fiscalmonth projectcode hoursworked
1           janfy13     101         16
2           janfy13     101         11
1           janfy13     102         8

Table: employees
[employee id]   manager
1               Manager A
2               Manager B

Table: kronoscodes
projectcode projectname
101         Project 101
102         Project 102
103         Project 103

使用直接的 INNER JOINS,您的“经理报告”的略微简化版本将如下所示:

内

SQL在哪里

SELECT employees.manager, timeworked.fiscalmonth, kronoscodes.projectname, 
    Sum(timeworked.hoursworked) AS SumOfHoursWorked
FROM employees INNER JOIN 
    (kronoscodes INNER JOIN timeworked 
        ON kronoscodes.projectcode = timeworked.projectcode
    ) ON employees.[employee id] = timeworked.employeeid
GROUP BY employees.manager, timeworked.fiscalmonth, kronoscodes.projectname;

结果看起来像这样

manager     fiscalmonth projectname SumOfHoursWorked
Manager A   janfy13     Project 101 16
Manager A   janfy13     Project 102 8
Manager B   janfy13     Project 101 11

嗯,没有提到“经理B”的“Project 102”,根本没有提到“Project 103”。尽管如此,这是一个很好的开始,所以让我们将其保存为“ProjectSumsByManager_innerJoin”。(以后可能有用……提示,提示。)

我们想查看所有项目,所以我们右键单击 [timeworked] 和 [kronoscodes] 之间的连接,选择“Join Properties”,然后选择选项“Include ALL records from 'kronoscodes' and only those records from 'timeworked'连接字段相等的地方。”

加入道具

不幸的是,当我们尝试运行查询时,我们得到了令人讨厌的“模糊外部连接”消息:

SQL 语句无法执行,因为它包含不明确的外部连接。要强制首先执行其中一个连接,请创建一个单独的查询来执行第一个连接,然后将该查询包含在您的 SQL 语句中。

好的,所以我们只使用该连接创建一个单独的查询:

外1

SQL在哪里

SELECT kronoscodes.projectcode, timeworked.employeeid, 
    timeworked.fiscalmonth, timeworked.hoursworked
FROM kronoscodes LEFT JOIN timeworked 
    ON kronoscodes.projectcode = timeworked.projectcode;

结果看起来像这样。

projectcode employeeid  fiscalmonth hoursworked
101         1           janfy13     16
101         2           janfy13     11
102         1           janfy13     8
103

嗯,“项目 103”在那里,但它没有员工 ID,所以我们无法链接到 [员工] 记录并获得经理。此外,“项目 102”仍然只与“员工 1”(“经理 A”)相关联,因此“经理 B”仍然不会出现。这种方法看起来并不是特别有希望。

也许我们真正想要的只是所有项目和所有经理的列表:

SELECT DISTINCT kronoscodes.projectname, employees.manager
FROM kronoscodes, employees;

返回

projectcode         manager
Project 101         Manager A
Project 101         Manager B
Project 102         Manager A
Project 102         Manager B
Project 103         Manager A
Project 103         Manager B

如果我们在 Access 中创建一个新查询,将该 SQL 语句键入(或粘贴)到 SQL 视图中,然后将其保存为“Project_Manager_map”,我们可以将其与上面的第一个查询 LEFT JOIN 并得到

外层2

SQL在哪里

SELECT Project_Manager_map.manager, ProjectSumsByManager_innerJoin.fiscalmonth, 
    Project_Manager_map.projectname, ProjectSumsByManager_innerJoin.SumOfHoursWorked
FROM Project_Manager_map LEFT JOIN ProjectSumsByManager_innerJoin ON 
    (Project_Manager_map.manager = ProjectSumsByManager_innerJoin.manager) 
        AND (Project_Manager_map.projectname = ProjectSumsByManager_innerJoin.projectname);

结果是

manager     fiscalmonth projectname SumOfHoursWorked
Manager A   janfy13     Project 101 16
Manager B   janfy13     Project 101 11
Manager A   janfy13     Project 102 8
Manager B               Project 102 
Manager A               Project 103 
Manager B               Project 103 
于 2013-03-29T12:47:30.910 回答