获取返回空白记录的访问权限?

时间:2013-03-28 20:34:36

标签: sql ms-access null

我用运气和胶带建立了一个处理一些员工数据的数据库。我每月都会收到一份大量的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

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

1 个答案:

答案 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”的略微简化版本将如下所示:

inner

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'的记录,其中连接的字段相等。“

joinprops

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

  

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

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

outer1

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 ,并获得

outer2

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