簡體   English   中英

SQL中的SQL連接和子查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM