1

employeeid(主キー)、* employee_name *を持つテーブルと、列* employee_id *(employee.idを参照する外部キー)、* start_date *(datetime)、* finish_date *(datetime)で呼び出される別のテーブルがありemployee_worksます。

従業員テーブルのデータは次のとおりです。

 **id**   **employee_name**
 1      employee A
 2      employee B
 3      employee C
 4      employee D
 5      employee E
 6      employee F
 7      employee G

employee_worksテーブル:

1  2010-01-01 00:00:00   NULL
2  2010-01-01 00:00:00   2010-01-10 10:00:00"
2  2010-01-13 00:00:00   2010-01-15 10:00:00"
2  2010-01-31 00:00:00   NULL
4  2010-02-18 00:00:00   2011-01-31 00:00:00"
6  2010-02-18 00:00:00   NULL

NULL値は、従業員がまだ働いていることを意味します。私は、従業員のリストを表示する単一のクエリを取得する必要があります。彼らが私たちと一緒に働いていた場合、私たちの会社でまだ働いている人、退職した人、可能であれば彼らが私たちと一緒に働いた期間。例:

id     employee_name       status
1      Employee A       Still with us
3      Employee C       Never worked
4      Employee D       Left

私の試み:

SELECT emp.id,emp.name,
CASE
WHEN occ.finish_date is NULL and occ.start_date is NOT NULL THEN 'Still working'
WHEN occ.finish_date is NULL and occ.start_date is NULL THEN 'Never Worked'
WHEN occ.finish_date is NOT  NULL and occ.start_date is NOT NULL THEN 'Left'
END
AS status

FROM employee AS emp
LEFT JOIN employee_works AS occ ON emp.id=occ.employee_id 
GROUP BY emp.id, occ.finish_date

また、従業員が別の列で働いた合計日数を取得したいですか?

4

2 に答える 2

1

問題は、ステータスの定義のためのgroup byがありますが、集計がないことです。Mysqlでは構文エラーは発生しません。代わりに、ランダムなステータスを提供します。

代わりに次のようなものを試してください。

select id, name,
       (CASE WHEN statusint = 3
             THEN 'Still working'
             WHEN statusint = 1 or statusint is null
             THEN 'Never Worked'
             WHEN statusint = 2
             THEN 'Left'
        END) AS status,
       days_worked
from (SELECT emp.id, emp.name,
             max(CASE WHEN occ.departure_date is NULL and occ.start_date is NOT NULL
                      THEN 3
                      WHEN occ.departure_date is NULL and occ.start_date is NULL
                      THEN 1
                      WHEN occ.departure_date is NOT NULL and occ.start_date is NOT NULL
                      THEN 2
                 END) AS statusint,
             sum(datediff(coalesce(departure_date, curdate()), occ.start_date
                ) as days_worked
      FROM employee emp LEFT JOIN
           employee_works occ
           ON emp.id=occ.employee_id
      GROUP BY emp.id, emp.name
     ) eg

mysqlのこの「機能」は非表示列と呼ばれます。mysqlを作成する人々(およびそれを使用する多くの人々)は、これが優れた機能であると考えています。他のデータベースを使用する多くの人々は、頭をかきむしり、なぜデータベースがそれほど奇妙に動作するのか疑問に思います。

ちなみに、複数回従業員がいる人に新しいIDが割り当てられているかどうかを確認する必要があります。その場合、クエリにはより高度な名前照合方法が必要になる場合があります。

于 2012-08-15T16:31:27.357 に答える
0

あなたの状態を単純化するようにしてください。

SELECT  a.*, 
        CASE
            WHEN b.employeeID IS NULL THEN 'NEVER WORKED'
            WHEN b.finish_date IS NULL THEN 'STILL WORKING'
            WHEN DATE(b.finish_date) < CURDATE() THEN 'LEFT'
        END as `Status`
FROM    employee a
            LEFT JOIN employee_works b
                on a.id = b.employeeID
于 2012-08-15T16:34:20.053 に答える