2012-10-09 66 views
1

我現在有一個查詢,顯示了我的團隊,他們的當前角色(從另一表中查找):加入兩個表的總和()表

SELECT firstName + ' ' + lastName as Name, 
     RTS_ROLE.roleDescription as `Current Role`, 
FROM RTS_STAFF, RTS_ROLE 
WHERE RTS_STAFF.staffRole = RTS_ROLE.roleID 
AND staffDeleted <> true 
ORDER BY roleID; 

而另一查詢列出了每個人的工作時間每週:

SELECT RTS_STAFF.staffId, Sum(IIf(Isnull(Monday),0,Monday) 
+IIf(Isnull(Tuesday),0,Tuesday) 
+IIf(Isnull(Wednesday),0,Wednesday) 
+IIf(Isnull(Thursday),0,Thursday) 
+IIf(Isnull(Friday),0,Friday)) AS `Weekly Hours` 
FROM WORKING_HOURS, RTS_STAFF 
WHERE RTS_STAFF.staffId = WORKING_HOURS.staffID 
AND Date() > WORKING_HOURS.EffectiveFrom 
GROUP BY RTS_STAFF.staffId; 

我試過(不成功)通過將第二查詢作爲子查詢中先用無果加入這些查詢:我得到「你已經寫在主查詢中不使用EXIST關鍵字就可以返回多個字段的子查詢...「

我試圖得到一個查詢,它將顯示來自同一查詢的工作人員姓名,角色名稱和'當前'總工作時間。有人可以給我一個線索如何實現這個目標,或者我做錯了什麼(毫無疑問,這簡直太尷尬了)。

如果能提供幫助,歡迎提供更多信息。

Table structure: 
RTS_ROLE: (lookup table) 
(pk)RoleID: number 
roleDescription: string 

RTS_STAFF 
(pk)staffId: number 
firstName: string 
lastName: string 
staffRole: number (fk to RTS_ROLE.roleID) 
staffDeleted: boolean 

WORKING_HOURS: 
(pk)workingWeekID: number 
staffID: number (fk to RTS_STAFF.staffId) 
Monday: number 
Tuesday: number 
... 
Friday:number 
EffectiveFrom: date 

我們使用(不要笑)MS Access 2007年

+0

你能發表表結構(只有重要的列)和SQL數據庫引擎的名稱和版本嗎? (我會重新創建這個表格,並試圖提供一個答案) – WBAR

+0

我已經將表格結構添加到原始文章;感謝您的努力! –

回答

1

我沒有訪問MSACCESS但我在MySQL準備的東西(您IIF類似於MySQL的IF):

SELECT staff.staffid, 
     staff.firstname + ' ' + staff.lastname AS Name, 
     role.roledescription     AS `Current Role`, 
     Sum(IF(Isnull(monday), 0, monday) 
      + IF(Isnull(tuesday), 0, tuesday) 
      + IF(Isnull(wednesday), 0, wednesday) 
      + IF(Isnull(thursday), 0, thursday) 
      + IF(Isnull(friday), 0, friday)) AS `Weekly Hours` 
FROM working_hours, 
     rts_staff staff, 
     rts_role role 
WHERE staff.staffrole = role.roleid 
     AND staff.staffdeleted <> true 
     AND staff.staffid = working_hours.staffid 
     AND Now() > working_hours.effectivefrom 
GROUP BY staff.staffid, 
      staff.firstname + ' ' + staff.lastname, 
      role.roledescription 

基於此結構:

CREATE TABLE `rts_staff` (
    `staffid` int(11) NOT NULL, 
    `staffrole` int(11) DEFAULT NULL, 
    `firstname` varchar(45) DEFAULT NULL, 
    `lastname` varchar(45) DEFAULT NULL, 
    `staffdeleted` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`staffid`) 
) ENGINE=InnoDB 


CREATE TABLE `rts_role` (
    `roleid` int(11) NOT NULL, 
    `roledescription` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`roleid`) 
) ENGINE=InnoDB 


CREATE TABLE `working_hours` (
    `staffid` int(11) NOT NULL, 
    `effectivefrom` date DEFAULT NULL, 
    `monday` int(11) DEFAULT NULL, 
    `tuesday` int(11) DEFAULT NULL, 
    `wednesday` int(11) DEFAULT NULL, 
    `thursday` int(11) DEFAULT NULL, 
    `friday` int(11) DEFAULT NULL, 
    PRIMARY KEY (`staffid`) 
) ENGINE=InnoDB 
+0

'現在()'功能可以改變日期你想要什麼:) – WBAR

+0

非常感謝您的幫助,我曾經(毫無疑問,通過無知)將我的頭撞在牆上幾個小時! –

+0

感謝您接受我的回答 – WBAR

1

嘗試這樣的事:

SELECT firstName + ' ' + lastName as Name, 
    RTS_ROLE.roleDescription as `Current Role`, x.weeklyhours 
    FROM RTS_STAFF s INNER JOIN 
    RTS_ROLE r ON s.staffRole = r.roleID INNER JOIN 
    (
    SELECT RTS_STAFF.staffId, Sum(IIf(Isnull(Monday),0,Monday) 
    +IIf(Isnull(Tuesday),0,Tuesday) 
    +IIf(Isnull(Wednesday),0,Wednesday) 
    +IIf(Isnull(Thursday),0,Thursday) 
    +IIf(Isnull(Friday),0,Friday)) AS weeklyhours 
    FROM WORKING_HOURS, RTS_STAFF 
    WHERE RTS_STAFF.staffId = WORKING_HOURS.staffID 
    AND Date() > WORKING_HOURS.EffectiveFrom 
    GROUP BY RTS_STAFF.staffId 
    ) x ON x.staffID = s.staffID 
WHERE s.staffDeleted <> true 
ORDER BY r.roleID;