gpt4 book ai didi

mysql - SQL中的SQL连接和子查询

转载 作者:行者123 更新时间:2023-11-29 00:41:45 25 4
gpt4 key购买 nike

我有一个表 employee 包含列 id(主键)*employee_name* 和另一个名为 employee_works 的表包含列 *employee_id* (外键引用 employee.id)、*start_date*(日期时间)、*finish_date*(日期时间)。

这里是员工表的一些数据:

 **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 的人(以及许多使用它的人)认为这是一个很棒的特性。许多使用其他数据库的人只是挠头,想知道为什么任何数据库都会表现得如此奇怪。

顺便说一句,您应该检查是否为多次受雇的人分配了新 ID。如果是这样,您的查询可能需要更高级的名称匹配方法。

关于mysql - SQL中的SQL连接和子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11973105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com