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;

私は(失敗して)2番目のクエリを最初のクエリとしてアベイルズなしでサブクエリとして配置することによってこれらのクエリを結合しようとしました:私は得ています'あなたは'で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

私たちはMSAccess2007を使用しています(笑わないでください)

4

2 に答える 2

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
于 2012-10-09T22:07:44.410 に答える
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;
于 2012-10-09T21:53:26.633 に答える