mysql 查询中的分组记录给出错误
Grouping records in mysql query gives error
我有一个查询应该读取 leave_requests_2014
table 中的记录,并对每个员工的所有记录的已接受休假请求执行 sum()
!
SELECT lr.emp_id employee,
ifnull(MAX(CASE WHEN lr.leave_type =2 THEN (sum((TO_DAYS(lr.end_date) - TO_DAYS(lr.start_date)+1))) END ) ,0) annual_leave,
ifnull(MAX(CASE WHEN lr.leave_type =3 THEN (sum((TO_DAYS(lr.end_date) - TO_DAYS(lr.start_date)+1))) END ),0) sick_leave
FROM leave_requests_2014 lr
WHERE lr.status =5
GROUP BY lr.emp_id
查询表明returns出现如下错误:
#1111 - Invalid use of group function
我真的不知道应该对什么进行分组才能获得所需的输出!
请看一下sqlfiddle这是我真正需要的结果
employee annual_leave sick_leave
5 7 2
6 4 1
一个更简单(且正确)的查询版本:
SELECT lr.emp_id AS employee,
SUM(IF(lr.leave_type = 2, DATEDIFF(lr.end_date, lr.start_date) + 1, 0)) AS annual_leave,
SUM(IF(lr.leave_type = 3, DATEDIFF(lr.end_date, lr.start_date) + 1, 0)) AS sick_leave,
FROM leave_requests_2014 lr
WHERE lr.status = 5
GROUP BY lr.emp_id
另一个版本,更简单,它在不同的行上生成年假和病假天数(如果需要):
SELECT lr.emp_id AS employee, lr.leave_type,
SUM(DATEDIFF(lr.end_date, lr.start_date) + 1) AS leave_days,
FROM leave_requests_2014 lr
WHERE lr.status = 5 AND lr.leave_type IN (2, 3)
GROUP BY lr.emp_id, lr.leave_type
这需要对客户端代码进行一些处理:检查 leave_type
的值以了解 leave_days
中的值是 "annual_leave" 还是 "sick_leave".如果查询未返回其他类型的休假天数,请使用 0
"Group by" MAX() and/or SUM() 等函数不能在同一语句中递归执行。一种解决方案是在子查询中执行第一个聚合。例如:
SELECT employee,
ifnull(MAX(CASE WHEN leave_type =2 THEN annual_leave END),0) annual_leave,
ifnull(MAX(CASE WHEN leave_type =3 THEN sick_leave END),0) sick_leave
FROM
(
SELECT lr.emp_id employee, lr.leave_type
(CASE WHEN lr.leave_type =2 THEN (sum((TO_DAYS(lr.end_date) - TO_DAYS(lr.start_date)+1))) END ) annual_leave,
(CASE WHEN lr.leave_type =3 THEN (sum((TO_DAYS(lr.end_date) - TO_DAYS(lr.start_date)+1))) END ) sick_leave
FROM leave_requests_2014 lr
WHERE lr.status =5
GROUP BY lr.emp_id, lr.leave_type
) firstAggregation
group by employee
我有一个查询应该读取 leave_requests_2014
table 中的记录,并对每个员工的所有记录的已接受休假请求执行 sum()
!
SELECT lr.emp_id employee,
ifnull(MAX(CASE WHEN lr.leave_type =2 THEN (sum((TO_DAYS(lr.end_date) - TO_DAYS(lr.start_date)+1))) END ) ,0) annual_leave,
ifnull(MAX(CASE WHEN lr.leave_type =3 THEN (sum((TO_DAYS(lr.end_date) - TO_DAYS(lr.start_date)+1))) END ),0) sick_leave
FROM leave_requests_2014 lr
WHERE lr.status =5
GROUP BY lr.emp_id
查询表明returns出现如下错误:
#1111 - Invalid use of group function
我真的不知道应该对什么进行分组才能获得所需的输出!
请看一下sqlfiddle这是我真正需要的结果
employee annual_leave sick_leave
5 7 2
6 4 1
一个更简单(且正确)的查询版本:
SELECT lr.emp_id AS employee,
SUM(IF(lr.leave_type = 2, DATEDIFF(lr.end_date, lr.start_date) + 1, 0)) AS annual_leave,
SUM(IF(lr.leave_type = 3, DATEDIFF(lr.end_date, lr.start_date) + 1, 0)) AS sick_leave,
FROM leave_requests_2014 lr
WHERE lr.status = 5
GROUP BY lr.emp_id
另一个版本,更简单,它在不同的行上生成年假和病假天数(如果需要):
SELECT lr.emp_id AS employee, lr.leave_type,
SUM(DATEDIFF(lr.end_date, lr.start_date) + 1) AS leave_days,
FROM leave_requests_2014 lr
WHERE lr.status = 5 AND lr.leave_type IN (2, 3)
GROUP BY lr.emp_id, lr.leave_type
这需要对客户端代码进行一些处理:检查 leave_type
的值以了解 leave_days
中的值是 "annual_leave" 还是 "sick_leave".如果查询未返回其他类型的休假天数,请使用 0
"Group by" MAX() and/or SUM() 等函数不能在同一语句中递归执行。一种解决方案是在子查询中执行第一个聚合。例如:
SELECT employee,
ifnull(MAX(CASE WHEN leave_type =2 THEN annual_leave END),0) annual_leave,
ifnull(MAX(CASE WHEN leave_type =3 THEN sick_leave END),0) sick_leave
FROM
(
SELECT lr.emp_id employee, lr.leave_type
(CASE WHEN lr.leave_type =2 THEN (sum((TO_DAYS(lr.end_date) - TO_DAYS(lr.start_date)+1))) END ) annual_leave,
(CASE WHEN lr.leave_type =3 THEN (sum((TO_DAYS(lr.end_date) - TO_DAYS(lr.start_date)+1))) END ) sick_leave
FROM leave_requests_2014 lr
WHERE lr.status =5
GROUP BY lr.emp_id, lr.leave_type
) firstAggregation
group by employee