2012-10-09 62 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;