1

a と b の 2 つのテーブルからデータを取得するレポートを作成しようとしています。レポートは a.clock ごとにグループ化されます。レポートのデータのほとんどは、その部分は正常に機能しています。a.clock は b.userID とリンクします。

私が苦労している部分は、データが b から来る列の 1 つです。メイン レポートの a.clock グループごとに以下を合計する必要があります (このクエリはスタンドアロンで動作します)。

 SELECT (
   SUM(
     TIME_TO_SEC(
       TIMEDIFF(
         CONCAT(b.endDate, ' ', b.outTime),
         CONCAT(b.startDate, ' ', b.inTime)
       )
     ) / 3600
   )
 ) AS 'Misc Hours' FROM b

つまり、各 a.clock の Misc Hours (b) を合計する必要があります。bテーブルに参加する必要があるのではないかと思いましたが、うまくいかなかったようです。助言がありますか?

テーブルの定義は次のとおりです(申し訳ありませんが、冗長です)

CREATE TABLE `a` (
  `laborID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `type` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '0=sched; 1=accepted; 2=complete; 3=authorize',
  `laborType` varchar(15) NOT NULL DEFAULT '0' COMMENT 'Lookup',
  `hours` varchar(15) NOT NULL DEFAULT '',
  `wage` varchar(15) NOT NULL DEFAULT '',
  `id` int(10) unsigned NOT NULL DEFAULT '0',
  `laborDate` date NOT NULL,
  `ot` varchar(15) NOT NULL,
  `clock` varchar(15) NOT NULL,
  `setup` varchar(15) NOT NULL DEFAULT '',
  `ot2` varchar(15) NOT NULL,
  `wageOT1` varchar(15) NOT NULL,
  `wageOT2` varchar(15) NOT NULL,
  `inTime` varchar(15) NOT NULL,
  `outTime` varchar(15) NOT NULL,
  `startDateString` varchar(125) NOT NULL,
  `endDateString` varchar(125) NOT NULL,
  `authRequestDate` datetime NOT NULL,
  `authRequestUser` int(10) unsigned NOT NULL,
  `authRequestReason` text NOT NULL,
  `authDate` datetime NOT NULL,
  `authUser` int(10) unsigned NOT NULL,
  `authRequired` varchar(45) NOT NULL,
  `km` varchar(45) NOT NULL,
  `travelTime` varchar(45) NOT NULL,
  `actualInTime` varchar(45) NOT NULL,
  `actualOutTime` varchar(45) NOT NULL,
  `actualKm` varchar(45) NOT NULL,
  `actualTravelTime` varchar(45) NOT NULL,
  `intNotes` text,
  `extNotes` text,
  `billableReason` text,
  `billableHours` varchar(45) DEFAULT NULL,
  `actualHours` varchar(45) DEFAULT NULL,
  `overtime` varchar(45) DEFAULT NULL,
  `followUpReason` text NOT NULL,
  `responseType` varchar(45) DEFAULT NULL,
  `followUpType` int(10) unsigned DEFAULT NULL,
  `billableDrop` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`laborID`),
  KEY `id` (`id`),
  KEY `type` (`type`),
  KEY `laborDate` (`laborDate`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;


CREATE TABLE `b` (
  `timecodeID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userID` int(10) unsigned NOT NULL,
  `inTime` varchar(45) NOT NULL,
  `outTime` varchar(45) NOT NULL,
  `startDateString` varchar(145) NOT NULL,
  `endDateString` varchar(145) NOT NULL,
  `startDate` varchar(45) NOT NULL,
  `endDate` varchar(45) NOT NULL,
  `type` varchar(45) NOT NULL,
  `comments` text NOT NULL,
  `multiDay` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY (`timecodeID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
4

2 に答える 2

0

各テーブルに複数の行がある場合は、レイバーの各行がタイムコードの各行と結合するため、合計が大きくなります。したがって、アイデアは、グループ化に従ってそれぞれ1つの行を取得するために、クロックとユーザーIDごとにクエリグループをネストすることです。

SELECT A.Clock, A.hours, B.'Misc Hours'
  FROM
     (
        SELECT labor.clock,
               SUM(hours) Hours
          FROM labor
         GROUP BY labor.clock
     ) A
 INNER JOIN 
     (
        SELECT  timecodes.userID,
                (SUM(
                     TIME_TO_SEC(
                          TIMEDIFF(
                               CONCAT(timecodes.endDate,' ',timecodes.outTime),
                               CONCAT(timecodes.startDate,' ',timecodes.inTime)
                          )
                      )/3600
                  )
                 ) AS 'Misc Hours'
         FROM timecodes
        GROUP BY timecodes.userID

) AS B ON A.Clock = B.UserId
于 2012-06-13T16:36:06.807 に答える
0
SELECT timecodes.userID,
       (SUM(
           TIME_TO_SEC(
                      TIMEDIFF(
                              CONCAT(timecodes.endDate,' ',timecodes.outTime),
                              CONCAT(timecodes.startDate,' ',timecodes.inTime)
                              )
                      )/3600
           )
       )
      AS 'Misc Hours'
FROM timecodes WHERE timecodes.userID=labor.clock GROUP BY labor.clock
于 2012-06-13T16:14:46.900 に答える