2012-01-05 81 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