我已经搜索并尝试解决这个难题,所有帮助将不胜感激......
我们使用在线时间表,每个位置都会记录自己的出勤情况。工资月份是从下个月的23日到22日。
第一个表“员工”,我只需要员工的姓名和员工编号(有超过一百名员工和员工离开,新员工定期离职)这里有一个例子:
employee_id employee_surname employee_first_name
SAL010 Briel Stephanus
SAL021 Kwaza Nakedi
SAL032 Motshabi Kotsamere
SAL034 Nkonwana Sibusiso
SAL056 Van Wyk Ben
第二个表“empl_attendance”保存员工出勤数据,每天更新,empl_attendance_total是重要字段,但如果员工由于某种原因不在工作,则该字段为“0”,则为sql必须在empl_attendance_start中输出描述,例如“OFF”:
empl_attendance_date employee_id empl_attendance_start empl_attendance_stop empl_attendance_total location_id
2012/08/23 SAL034 06:00 18:00 11 Middelkraal
2012/08/24 SAL034 06:00 18:00 11 Middelkraal
2012/08/25 SAL034 06:00 18:00 11 Middelkraal
2012/08/26 SAL010 06:00 18:00 11 Middelkraal
2012/08/23 SAL021 18:00 06:00 11 Middelkraal
2012/08/24 SAL021 18:00 06:00 11 Middelkraal
2012/08/25 SAL021 AWOL 0 Middelkraal
2012/08/23 SAL032 OFF 0 Middelkraal
2012/08/24 SAL032 OFF 0 Middelkraal
2012/08/23 SAL056 18:00 06:00 11 Middelkraal
此处location_id非常重要,因为该位置是从上一页预先选择的。所需的输出看起来如下所示,从本月23日开始,直到下个月的22日。该期间也在上一页中选择:
employee_id employee_surname employee_first_name 2012/08/23 2012/08/24 2012/08/25 2012/08/26
SAL010 Briel Stephanus 11 OFF 11 11
SAL021 Kwaza Nakedi 11 11 AWOL 11
SAL032 Motshabi Kotsamere OFF OFF 8 8
SAL034 Nkonwana Sibusiso 11 11 11 OFF
SAL056 Van Wyk Ben 11 AWOL 8 8
我第一次使用数据透视表时,我的日期会逐月变化,员工可能会在任何特定时间发生变化......
答案 0 :(得分:0)
不幸的是,MySQL没有PIVOT
函数,因此您需要使用带有CASE
语句的聚合函数来获得最终结果。
要硬编码,你会使用类似的东西(未经测试):
select e.id,
e.surname,
e.firstname,
max(case when a.dt = '2012-08-23' then a.total end) '2012-08-23'
from employee e
inner join attendance a
on e.id = a.emp_id
group by e.id, e.surname, e.firstname
但如果您不知道这些值,那么您将需要使用类似于此的预准备语句(未经测试):
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(case when yourdate = ''',
yourdate,
''' then a.total END) AS ',
yourdate
)
) INTO @sql
FROM
Results;
SET @sql = CONCAT('SELECT e.id,
e.surname,
e.firstname, ', @sql, '
from employee e
inner join attendance a
on e.id = a.emp_id
group by e.id, e.surname, e.firstname');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
以下是动态数据透视的实例: