0

私はまだphp/mysqlに少し慣れていないという事実から始めましょう。

私は、顧客の完了した仕事を記録するために使用できるシステムを構築しようとしています。このシステムは、仕事番号、顧客名、設備、日付、およびタスクに割り当てられた従業員を追跡します。

従業員の割り当てを処理するためのテーブル設定がありますが、結果を希望どおりにフォーマットする方法がわからないようです。

数日間にわたって同じ仕事に複数の従業員が割り当てられる可能性があります。だから私は次のようなテーブルを設定します:

job_ID  |  employee_name  |  date_worked  |  hours_worked
  1     |      Dave       |   2010-1-2    |     4.5
  1     |      Dave       |   2010-1-3    |     4.0
  1     |      Mike       |   2010-1-2    |     6.0
  2     |      Bill       |   2011-5-7    |     8.0
  2     |      Bill       |   2011-5-8    |     6.5
  2     |      Dave       |   2011-5-7    |     4.0
  2     |      Dave       |   2011-5-8    |     4.5

結果で私が探しているのは、次のように出力されます。

    Job # = 1
    Employee  |  2010-1-2  |  2010-1-3  | 
      Dave    |     4.5    |     4.0    |
      Mike    |     6.0    |      0     |

    Job # = 2
    Employee  |  2011-5-7  |  2011-5-8  | 
      Bill    |     8.0    |     6.5    |
      Dave    |     4.0    |     4.5    |

誰かアドバイスはありますか?

編集

わかりました、それで私はいくつかの情報を省略したと思います。

レコードを保持するために使用されるテーブル(job_list)があります。

このテーブルには、job_id、クライアント、機器、場所、呼び出し日、応答日、完了日などが記録されます。

次に、すべての従業員をIDと名前で一覧表示するテーブル(employee_list)があります。

私が以前に投稿したテーブルの背後にある考え方は、誰が、どこで、何日、どのくらいの期間、どこにいたかを記録するテーブルになることでした。

投稿したテーブルをemployee_idを持つように修正しました。

そして、私が投稿した出力のように、結果をphpで表示したいと思います。どうすればいいのかわからない。

他にどのような情報を提供できますか?投稿する必要があるものについて理解が不足していることをお詫びします:-/

そして、私のアプローチが完全にひどい場合、私はまだこれに慣れていないと言いました...

4

1 に答える 1

1

これは基本的にですPIVOTが、MySQL にはPIVOT関数がないため、集計関数とCASEステートメントを使用して複製する必要があります。変換するすべての値がわかっている場合、クエリは次のようになります。

select employee_name,
  sum(case when date_worked = '2010-01-02' then hours_worked else 0 end) `2010-01-02`,
  sum(case when date_worked = '2010-01-03' then hours_worked else 0 end) `2010-01-03`
from yourtable
group by employee_name

デモで SQL Fiddle を参照してください

結果は次のとおりです。

| EMPLOYEE_NAME | 2010-01-02 | 2010-01-03 |
-------------------------------------------
|          Bill |          0 |          0 |
|          Dave |        4.5 |          4 |
|          Mike |          6 |          0 |

値の数が不明な場合は、準備済みステートメントを使用してこれを動的に生成できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when date_worked = ''',
      date_worked,
      ''' then hours_worked else 0 end) AS `',
      date_worked, '`'
    )
  ) INTO @sql
FROM yourtable;

SET @sql = CONCAT('SELECT employee_name, ', @sql, ' 
                  FROM yourtable 
                   GROUP BY employee_name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

デモで SQL Fiddle を参照してください

どちらも同じ結果になります。

于 2012-11-15T21:22:41.983 に答える