期间的动态数据透视表,加入2个表

时间:2012-08-27 19:43:03

标签: mysql sql pivot-table

我已经搜索并尝试解决这个难题,所有帮助将不胜感激......

我们使用在线时间表,每个位置都会记录自己的出勤情况。工资月份是从下个月的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

我第一次使用数据透视表时,我的日期会逐月变化,员工可能会在任何特定时间发生变化......

1 个答案:

答案 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;

以下是动态数据透视的实例:

Select dynamic Columns in mysql