0

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

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

我第一次使用数据透视表,我的日期每个月都在变化,员工可能会在任何给定时间改变......

4

1 回答 1

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;

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

在mysql中选择动态列

于 2012-08-27T21:20:04.827 回答