2012-08-27 73 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