有几个视图可以完成这项工作:一个用于工作时间,一个用于员工,然后您可以加入它们并对您的过滤器进行编程,如下所示:
-- Query the working hours
CREATE VIEW
vw_working_hours
AS
SELECT
employee_id,
year,
month,
SUM((timeout+12) - timein ) AS total_working_hours
FROM
timesheets
GROUP BY
employee_id,
year,
month;
-- Query the employees
CREATE VIEW
vw_employees
AS
SELECT
DISTINCT
employee_id,
employee_name,
department
FROM
timesheets;
-- This query is the actual report
-- just had to filter by department
-- in your script
SELECT
wh.employee_id,
emp.employee_name,
wh.total_working_hours
FROM
vw_working_hours AS wh
JOIN
vw_employees AS emp
ON
wh.employee_id = emp.employee_id
WHERE
wh.year = 2016
AND
wh.month = '09'
AND
emp.department = 'finance';
或者,在单个查询中(无视图):
SELECT
wh.employee_id,
emp.employee_name,
wh.total_working_hours
FROM
(
SELECT
employee_id,
year,
month,
SUM((timeout+12) - timein ) AS total_working_hours
FROM
timesheets
GROUP BY
employee_id,
year,
month
) AS wh
JOIN
(
SELECT
DISTINCT
employee_id,
employee_name,
department
FROM
timesheets
) AS emp
ON
wh.employee_id = emp.employee_id
WHERE
wh.year = 2016
AND
wh.month = '09'
AND
emp.department = 'finance';
在 php 中,您应该使用循环和累积变量。首先,您应该使用这样的查询进行预过滤:
SELECT
*
FROM
timesheets
WHERE
department = 'finance'
AND
year = 2016
AND
month = '09'
ORDER BY
employee_id;
那么如果结果在一个名为 $rows 的多维数组中,在 php 中是这样的:
$employee_id = $rows[0]['employee_id'];
$employee_name = $rows[0]['employee_name'];
$accumulated = 0;
foreach($rows as $row) {
$total_working_hours = ($row['timeout'] + 12) - $row['timein'];
if ( $row['employee_id'] == $employee_id ) {
// Same employee, acumulate
$accumulated += $total_working_hours;
} else {
// Another employee, pass the acumulation to result
$rowTmp['employee_id'] = $employee_id;
$rowTmp['employee_name'] = $employee_name;
$rowTmp['total_working_hours'] = $accumulated;
$result[] = $rowTmp;
// Updated the accumulation variables
// new employee
$employee_id = $row['employee_id'];
$employee_name = $row['employee_name'];
// reset accumulated
$accumulated = $total_working_hours;
}
}
// at the end, updates the las result:
$rowTmp['employee_id'] = $employee_id;
$rowTmp['employee_name'] = $employee_name;
$rowTmp['total_working_hours'] = $accumulated;
$result[] = $rowTmp;
// Should pass result to HTML table
print_r( $result );