我用运气和胶带建立了一个处理一些员工数据的数据库。我每月都会收到一份大量的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
所以基本上我希望每个财政月份的每个项目代码都会回来,即使我导入的数据中“工作小时数”下没有任何内容。
答案 0 :(得分: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,“Report by Manager”的略微简化版本将如下所示:
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项经理”的“102项”,也没有提到“项目103”。不过,这是一个非常好的开始,所以我们将它保存为“ProjectSumsByManager_innerJoin”。 (稍后可能会有用......提示,提示。)
我们希望看到所有项目,因此我们右键单击[timeworked]和[kronoscodes]之间的联接,选择“加入属性”,然后选择“包含所有记录”选项kronoscodes'和只有那些来自'timeworked'的记录,其中连接的字段相等。“
不幸的是,当我们尝试运行查询时,我们会得到令人讨厌的“模糊外连接”消息:
无法执行SQL语句,因为它包含不明确的外连接。要强制首先执行其中一个连接,请创建一个执行第一个连接的单独查询,然后在SQL语句中包含该查询。
好的,我们只使用该连接创建一个单独的查询:
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
那么,“Project 103”就在那里,但它没有员工,所以我们无法链接到[员工]记录并获得经理。此外,“项目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 ,并获得
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