【问题标题】:Getting Access to return blank records?获取访问权限以返回空白记录?
【发布时间】:2013-03-28 20:34:36
【问题描述】:

我靠运气和胶带建立了一个数据库来处理一些员工数据。我每月收到一个包含以下字段的大型 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

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

【问题讨论】:

  • “海量 Excel 电子表格”和“一切顺利”不属于同一上下文。
  • 您需要查询设计窗口和左连接。例如SELECT ProjectID, ProjectName, Hours FROM Projects LEFT JOIN EmployeeHours ON Projects.ProjectID = EmployeeHours.ProjectID 现在,您将需要显示足够的样本数据,以便人们可以合理地产生这样的查询。您需要将庞大的电子表格制作成这样的表格。
  • 我已将其分解为表格 - 一张用于员工 ID 和姓名,一张用于会计月份,一张用于项目代码,一张用于工作时间。不过,我会试试你发布的内容,然后再报告!
  • 您能分享一下您目前的查询吗?表格定义(列名引用)也会有所帮助。
  • 我在原帖中添加了代码。

标签: sql ms-access null


【解决方案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”的“项目102”,根本没有提到“项目103”。尽管如此,这是一个很好的开始,所以让我们将其保存为“ProjectSumsByManager_innerJoin”。 (以后可能有用……提示,提示。)

我们想查看所有项目,所以我们右键单击 [timeworked] 和 [kronoscodes] 之间的连接,选择“Join Properties”,然后选择“Include ALL records from ”选项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

嗯,“项目 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 that 与上面的第一个查询,并得到

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 

【讨论】:

  • 感谢您的帮助,但初始代码对我不起作用。它说“您尝试执行的查询不包括指定的表达式管理器作为聚合函数的一部分。(错误 3122)”
  • @TeresaMontgomery 如果您在谈论我回答中的第一个查询,请检查GROUP BY 子句以确保包含employees.manager。您始终可以使用您尝试过的实际 SQL 查询来编辑您的答案,如有必要,我可以修改我的答案以尝试适应。
  • 我不知道我昨天做错了什么,但我今天必须修复它,因为它可以工作!我已经断断续续地玩了几个月,但无法弄清楚。你太棒了!非常感谢!
  • 我试图让它“提及”戈德汤普森,但我的评论中没有显示我试图链接他。也许它不会这样做,因为我正在回复他发布的答案,所以他还是会得到它?我不确定,但我想确保他看到我认为他很棒! :)
  • 这是我的第一个问题,所以我不知道接受 - 现在完成! :)
猜你喜欢
  • 2022-08-07
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多