2012-01-05 39 views
1

的我有一个先进的查询/报告,我需要帮助在Access 2007中创建 我需要生成的查询是:高级查询具有位逻辑

Employee Last, Employee First, Employee Role, Course Name, StartDate, EndDate, Attended 

,我需要处理,这是逻辑:

  1. 如果用户已经出席了employeerole = courserole课程, 参加=是
  2. 如果用户还没有参加的课程与Employeerole = courserole, 出席=没有
  3. 如果用户没有参加并没有具有匹配 CourseRole课程,与该角色

一些额外的逻辑,这将是很好的将是添加出席=否课程:培训师最后选择
逻辑:如果数据是空的,训练员最后=没有训练员分配

它不会让我发布数据库的图片。因此,这里是参照Entegrity表格:

Tables: Fields 
Employee: Employee_PK, Employee_Last, Employee_first, Employee_userid 
Role: Role_PK, RoleNAme 
EmployeeRole: EmployeeRole_PK, Employee_ID, Role_ID 
Location: Location_PK, Location 
Course: Course_PK, StartDate, EndDate, CourseName, CourseNotes, Location_ID 
CourseAttendance: CourseAttendance_PK, Course_ID, Employee_ID 
CourseRole: CourseRole_PK, Course_ID, Role_ID 
Trainer: Trainer_PK, TrainerLast, TrainerFirst 
TrainerCourse:Trainer_PK, Trainer_ID, Course_ID 

所以,你可以看到它的标准化,并且有多到许多需要哪些
PK是主键,ID被用作外键许多表。所以是的,这些都没问题。

编辑:
该查询被张贴在评论:
我已经尝试了多个查询。

SELECT qryEmployeeCoursesForRole.*, IIf(IsNull([courseattendance_PK]),"No","Yes") AS Attended 
FROM qryEmployeeCoursesForRole 
LEFT JOIN CourseAttendance 
    ON (qryEmployeeCoursesForRole.COURSE_ID = CourseAttendance.COURSE_ID) 
    AND (qryEmployeeCoursesForRole.EMPLOYEE_ID = CourseAttendance.EMPLOYEE_ID); 

这一个犯规处理没有规定当然除外 -

Course Table: 
COURSE_PK START DATE END DATE COURSENAME NOTES   LOCATION_ID 
1   12/2/2012 12/2/2012 OTC   No Notes   3 
2   12/1/2012 12/1/2012 OTC   No Note    2 
3   1/5/2012 1/5/2012 Requistions Text Text Text  1 
             and P-Cards 

CourseAttendance Table: 
COURSEATTENDANCE_PK COURSE_ID EMPLOYEE_ID 
1     1    1 
2     2    2 

CourseRole Table: 
COURSEROLE_PK COURSE_ID ROLE_ID 
1     1   1 
2     1   2 
3     1   3 
4     2   1 
5     2   2 

Employee Table: 
EMPLOYEE_PK EMPLOYEE_LAST EMPLOYEE_FIRST EMPLOYEE_USERID 
1    Ables  Christopher  LG854 
2    Ables  Gary    LC876 
3    Ables  Steven    LQ875 

EmployeeRole Table: 
EMPLOYEEROLE_PK EMPLOYEE_ID ROLE_ID 
1      1   1 
2      1   2 
3      1   3 
4      2   1 
5      2   2 
6      3   4 

Location Table: 
LOCATION_PK LOCATION 
1    New York 
2    New Brunfels 
3    Ontario 
4    China 

Role Table: 
ROLE_PK ROLENAME 
1    Service Coordinator  
2    Service Planner 
3    Service Entry 
4    AP Invoice 

Trainer Table: 
TRAINER_PK TRAINER_LAST TRAINER_FIRST TRAINER_USERID 
1    Brunet    Janell  
2    Gibson    Jim    hb476 
3    Taylor    Diana   hblo7hg 

TrainerCourse Table: 
TRAINERCOURSE_PK TRAINER_ID COURSE_ID 
1      1   1 
2      1   2 
3      2   2 

现在,我已经在这个很多细节通过逻辑走到看来这需要的不仅仅是看中查询更多。如果你需要我更具体,我可以但它会要求我上传文件或其他东西。

所有查询我创建和原因查询:

EmployeeCourseOutsideofRole 
SELECT CourseAttendance.EMPLOYEE_ID, CourseAttendance.COURSE_ID, Course.COURSE_NAME 
FROM Course INNER JOIN (CourseAttendance LEFT JOIN qryEmployeeCoursesForRole ON 
(CourseAttendance.COURSE_ID = qryEmployeeCoursesForRole.COURSE_ID) AND 
(CourseAttendance.EMPLOYEE_ID = qryEmployeeCoursesForRole.EMPLOYEE_ID)) ON Course.COURSE_PK = 
CourseAttendance.COURSE_ID 
WHERE (((qryEmployeeCoursesForRole.EMPLOYEE_ID) Is Null) AND  
((qryEmployeeCoursesForRole.COURSE_ID) 
Is Null)); 
If Employee took a Course and the CourseRole not equal to EmployeeRole 

EmployeeCoursesForRoleSub: 
SELECT [Employee_last] & " " & [employee_first] AS FullName, Role.ROLENAME, 
EmployeeRole.EMPLOYEE_ID, EmployeeRole.ROLE_ID 
FROM Role INNER JOIN (Employee INNER JOIN EmployeeRole ON Employee.EMPLOYEE_PK = 
EmployeeRole.EMPLOYEE_ID) ON Role.ROLE_PK = EmployeeRole.ROLE_ID; 
This is a SubQuery only--for next 

qryEmployeeCourseForRole: 
SELECT qryEmployeeCoursesForRoleSub.*, CourseRole.COURSE_ID 
FROM qryEmployeeCoursesForRoleSub LEFT JOIN CourseRole ON qryEmployeeCoursesForRoleSub.ROLE_ID = 
CourseRole.ROLE_ID; 
This shows courserole with matching employeerole--a subquery for next 

EmployeeCourseForRoleWAttended: 
SELECT qryEmployeeCoursesForRole.*, IIf(IsNull([courseattendance_PK]),"No","Yes") AS Attended 
FROM qryEmployeeCoursesForRole LEFT JOIN CourseAttendance ON (qryEmployeeCoursesForRole.COURSE_ID = 
CourseAttendance.COURSE_ID) AND (qryEmployeeCoursesForRole.EMPLOYEE_ID = 
CourseAttendance.EMPLOYEE_ID); 

用于调试

Employee Table: 
Employee_PK  Employee_Last  Employee_First 
Autonumber  Daigle    Jake 
Autonumber  Ryder    Canen 

Role Table: 
Role_PK RoleName 
    5   Asset Shipper 
    6   Material Controller 
    7   Material MAnager 

EmployeeRole Table: 
EmployeeRole_PK  Employee_ID   Role_ID 
Autonum    Whatever Daigle is  5 
Autonum    Whatever Daigle is  1 
Autonum    Whatever Ryder is  5 
Autonum    Whatever Ryder is  6  

Course Table:    
Course_PK Course_Name Course_StartDate Course_EndDate 
    4   OTC   12/8/2011  12/9/2011 

CourseRole Table: 
CourseRole_PK Course_ID  Role _ID 
    6    4    1 
    7    4    7 

CourseAttendance: 
CourseAttendance_PK  Course_ID  Employee_ID 
    Autonum     4    Whatever Daigle is 
    Autonum     4    Whatever Ryder is 

确定附加采样数据I张贴的样本数据。如果用户参加了满足其角色之一的课程并且courserole = employeerole,那么问题就会发生,那么查询报告他们已经完成了他们的所有角色。

我需要在一个单一的报告内容:

员工姓,雇员的名字,角色1,CoureName,开始日期,结束日期,出席 但逻辑将需要在那里,因为我有它上市以上在帖子的开头。

+0

有你的表有一些差异。首先,你在EmployeeRole中有一个名为Role_ID的字段,就是你的Role表中的Role_PK?另外在你EmployeeRole表Employee_ID员工表中的Employee_PK或Employee_userid? – Taryn 2012-01-05 15:34:56

+0

编辑您的问题并发布一些示例数据将会有帮助 – Taryn 2012-01-05 15:47:15

+1

大多数人在说样本数据时,都是指相关表格的一小部分被剪切并粘贴到问题中。 – Fionnuala 2012-01-05 16:29:34

回答

3

它的一种凌乱,但这应该让你开始。根据你上面的表格结构,你的设计有点偏离。你的表格中有不必要的列,但那不是你的问题。

这可以被分成3个不同的查询或只使用一个UNION像我一样如下:

'this first query gets you the employees who have attended 
SELECT E.EmployeeLast, E.EmployeeFirst, R.RoleName AS EmployeeRole 
    , C.CourseName, C.StartDate, C.EndDate, "Yes" AS Attended 
FROM (((Employee AS E 
INNER JOIN EmployeeRole AS ER 
    ON E.EmployeePK=ER.EmployeeId) 
INNER JOIN Role AS R 
    ON ER.RoleID=R.RolePK) 
LEFT JOIN CourseAttendance AS CA 
    ON E.EmployeePK=CA.EmployeeID) 
LEFT JOIN Course AS C 
    ON CA.CourseID=C.CoursePK 
WHERE E.EmployeePK IN (SELECT CA.EmployeeID 
         FROM ((CourseAttendance CA 
         INNER JOIN EmployeeRole ER 
          ON CA.EmployeeId = ER.EmployeeId) 
         INNER JOIN CourseRole CR 
          ON ER.RoleId = CR.RoleId 
          AND CA.CourseID = CR.CourseID)); 

UNION 

'this second query gets you the employees who have not attended 
SELECT E.EmployeeLast, E.EmployeeFirst, R.RoleName AS EmployeeRole 
    , C.CourseName, C.StartDate, C.EndDate, "No" AS Attended 
FROM (((Employee AS E 
INNER JOIN EmployeeRole AS ER 
    ON E.EmployeePK=ER.EmployeeId) 
INNER JOIN Role AS R 
    ON ER.RoleID=R.RolePK) 
LEFT JOIN CourseAttendance AS CA 
    ON E.EmployeePK=CA.EmployeeID) 
LEFT JOIN Course AS C 
    ON CA.CourseID=C.CoursePK 
WHERE E.EmployeePK NOT IN (SELECT CA.EmployeeID 
         FROM ((CourseAttendance CA 
         INNER JOIN EmployeeRole ER 
          ON CA.EmployeeId = ER.EmployeeId) 
         INNER JOIN CourseRole CR 
          ON ER.RoleId = CR.RoleId 
          AND CA.CourseID = CR.CourseID)); 

UNION 

'this final query gets you the employees who have not attended and there is no course with their role 
SELECT E.EmployeeLast, E.EmployeeFirst, R.RoleName AS EmployeeRole 
    , C.CourseName, C.StartDate, C.EndDate, "No Course With Role" AS Attended 
FROM (((Employee AS E 
INNER JOIN EmployeeRole AS ER 
    ON E.EmployeePK=ER.EmployeeId) 
INNER JOIN Role AS R 
    ON ER.RoleID=R.RolePK) 
LEFT JOIN CourseAttendance AS CA 
    ON E.EmployeePK=CA.EmployeeID) 
LEFT JOIN Course AS C 
    ON CA.CourseID=C.CoursePK 
WHERE ER.RoleID NOT IN (SELECT RoleID 
         FROM CourseRole) 
    AND E.EmployeePK NOT IN (SELECT CA.EmployeeID 
           FROM ((CourseAttendance CA 
           INNER JOIN EmployeeRole ER 
            ON CA.EmployeeId = ER.EmployeeId) 
           INNER JOIN CourseRole CR 
            ON ER.RoleId = CR.RoleId 
            AND CA.CourseID = CR.CourseID)); 
+0

我现在要试一试。在我编辑脚本以适合我的数据库后,将会报告回 – Piercy 2012-01-05 19:50:08

+0

BlueFeet ...我印象深刻。在我的测试数据库中,我必须创建这些数据库才能获取示例数据,它可以按照需要运行。我将把它移到我的临时数据库并试用它。我会回报。我非常欣赏这一努力。 – Piercy 2012-01-05 20:13:17

+0

好的我认为第一个查询可能存在问题。当我将这些数据转储到具有更真实数据的Staging数据库时,我将结果过滤为1个角色(此角色没有定义任何课程)。据报道,一些人参加了这个角色的=是,其他人参加了“没有角色的课程”。有什么想法吗? – Piercy 2012-01-05 20:29:47