2012-08-27 45 views
0

我已搜查,并试图解决这一难题,所有的帮助将不胜感激......动态数据透视表的时期,加入2个表

我们使用在线时间表,每个位置捕捉自己的出勤率。工资月份是从下个月的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很重要,因为位置是从上一页中预先选择的。期望的iutput看起来如下所示,并从本月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

不幸的是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; 

这里是一个动态枢轴的工作示例:

Select dynamic Columns in mysql