对于数据分析项目,我需要按以下格式拆分有关过时员工时间表的表格:
Employee|Start_Days|End_Days|...
0001|0|7|...
0001|7|14|...
0001|14|21|...
0002|0|7|...
0002|14|21|...
...
对于这两列,我在CASE语句中使用了用户定义的变量@cur_Count。
...
(
CASE
e.EMPLOYEE
WHEN
@cur_Employee
THEN
@cur_Count := @cur_Count + 1
ELSE
@cur_Count := 1
AND @cur_Employee := e.EMPLOYEE
END
) * 7 AS START_DAYS,
(@cur_Count + 1) * 7 AS END_DAYS,
...
FROM
tmp_MS_Relevant_Employees AS e,
hlp_MS_Calendar_Weeks AS c,
(SELECT @cur_Employee = '', @cur_Count := 0) AS init
WHERE
...
这个陈述非常合适 - 除了(因为@cur_Count在ELSE子句中重置为1),员工的第一个条目从第7天开始而不是0。 但是,如果我使用以下其中一个
@cur_Count := 0
@cur_Count := @cur_Count * 0
@cur_Count := @cur_Count - @cur_Count
或以任何其他方式将变量重置为0,输出如下所示:
Employee|Start_Days|End_Days|...
0001|0|7|...
0001|0|7|...
0001|0|7|...
显然变量忽略了重置为0后更新其值的任何尝试。虽然这个问题很容易解决,但仍然令人费解(并且解决方法并不整洁)。我在这里遗漏了什么或者这是MySql的错误吗?
提前感谢您的任何反馈!
答案 0 :(得分:0)
将AND
表达式的顺序切换为
(@cur_Employee := e.EMPLOYEE)
AND (@cur_Count := 0)
这是因为AND
执行短路。当您指定0
时,会将其视为FALSE
,因此不会执行分配。
另一个选择是在乘以后减去7
:
(
CASE
e.EMPLOYEE
WHEN
@cur_Employee
THEN
@cur_Count := @cur_Count + 1
ELSE
(@cur_Count := 1)
AND (@cur_Employee := e.EMPLOYEE)
END
) * 7 - 7 AS START_DAYS,