0

私はこのパズルを検索して解決しようとしました、すべての助けがありがたいです...

私たちはオンラインタイムシートを使用しており、各場所はそれぞれの出席を記録しています。給与月は23日から翌月22日までです。

最初のテーブル「従業員」、ここに必要なのは、従業員の名前、名前、および従業員番号(100人を超える従業員と従業員が退職し、新しい従業員が定期的に任命される場合)のみです。

employee_id employee_surname employee_first_name
SAL010  Briel   Stephanus
SAL021  Kwaza   Nakedi
SAL032  Motshabi    Kotsamere
SAL034  Nkonwana    Sibusiso
SAL056  Van Wyk Ben

2番目のテーブル"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 に答える