[英]SQL join and sub query in sql
我有一個表employee
它具有列id (主鍵),* employee_name *和另一個名為employee_works
表,該表具有* employee_id *(引用employee.id的外鍵),* start_date *(日期時間),* finish_date *(日期時間)列。
以下是有關employee表的一些數據:
**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
我還想獲得員工在另一列中工作的總天數嗎?
問題是您有一個分組依據,但沒有用於狀態定義的匯總。 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的人們(以及許多使用mysql的人們)認為這是一個很棒的功能。 許多使用其他數據庫的人只是scratch之以鼻,想知道為什么任何數據庫的行為都會如此奇怪。
順便說一句,您應該檢查是否多次雇用的人被分配了新的ID。 如果是這樣,您的查詢可能需要更高級的名稱匹配方法。
嘗試簡化您的狀況。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.