我会尝试提供一些背景信息,以便您了解我在此尝试实现的目标。我的公司使用开源软件来管理员工离职(Jorani,随意谷歌吧:)。
有不同类型的假期(假期,病假等),我们想计算时间"未使用"从2016年的假期和"复制"他们来到另一种类型的休假,叫做#34;剩余假期2016"。
重要的表格是:
有权日(此处指定您为员工提供的每种类型的天数)
id employee startdate enddate type days description
661 3 2016-01-01 2017-02-28 1 14.00 Holidays 2016
1296 3 2016-01-01 2016-12-31 4 18.00 Sick leave 2016
离开(此表包含有关员工离职的信息)
id startdate enddate status employee cause duration type
2436 2016-08-01 2016-08-01 3 78 OK from managers 1.00 1
2766 2016-09-05 2016-09-12 3 63 Holidays 6.00 1
基本上我们有:
题为: 数据存储在上面显示的subjectdays表中。在我们的示例中,我们假设我的2016年假期有14天。
采取叶子 用户采取的叶子,存储在上面所示的叶子表中。对于我们的例子,我们假设我在8月1日和9月的6天休假了一天。
可用树叶 计算可用天数:标题天数减去"采取叶子"。对于这个例子,14个标题日 - 7 = 7天。所以我假期还有七天时间:D
所以我的目标是将此用户的这7天插入新类型的标题天数:" 2016年剩余天数"并为每个用户执行此操作。因此,我想到的解决方案是为每个用户做这样的事情:
INSERT INTO entitleddays (employee, startdate, enddate, type, days, description)
SELECT id, '2017-01-01', '2017-02-31', '8', (entitled holidays for 2016 minus all the taken leaves of this type), 'Remaining holidays from 2016'
FROM users
其中8是我要复制日期的新类型休假(2016年剩余假期)。
例如,对于特定用户,我可以从2016年开始度假:
SELECT SUM(duration)
FROM leaves
WHERE employee=3 AND status=3 AND type=1
注意:类型1是休假的类型"假期2016"和状态3表示请假请求已被接受。
我可以在单个SQL指令中实现所有这一切,但如果更简单或最容易管理/理解,它也可以分成更多。
非常感谢提前。
答案 0 :(得分:2)
这是您处理计算的方法:
WHERE
- 条款<强>查询:强>
SELECT
entitled.employee,
'2017-01-01',
'2017-02-31',
'8' AS type,
entitled.days - takenDays.days,
'Remaining holidays from 2016'
FROM
(
SELECT
employee,
SUM(days) AS days
FROM
entitleddays
WHERE
startdate >= '2016-01-01'
AND type = 1
GROUP BY
employee
) AS entitled
LEFT JOIN (
SELECT
employee,
SUM(duration) AS days
FROM
`leaves`
WHERE
startdate >= '2016-01-01'
AND type = 1
GROUP BY
employee
) AS takenDays ON takenDays.employee = entitled.employee
我不确定您是否想要计算有权日和受理天数的总和。查询只会检查startdate >= '2016-01-01'
。
你在尝试中提到了一个表users
,但没有提供该表的详细信息,所以我把它留了下来。我想你可以用它作为基础。在当前查询中,entitleddays
的分组结果是基础。
对于插入
INSERT INTO entitleddays (employee, startdate, enddate, type, days, description)
SELECT
entitled.employee,
'2017-01-01',
'2017-02-31',
'8' AS type,
entitled.days - takenDays.days,
'Remaining holidays from 2016'
FROM
(
SELECT
employee,
SUM(days) AS days
FROM
entitleddays
WHERE
startdate >= '2016-01-01'
AND type = 1
GROUP BY
employee
) AS entitled
LEFT JOIN (
SELECT
employee,
SUM(duration) AS days
FROM
`leaves`
WHERE
startdate >= '2016-01-01'
AND type = 1
GROUP BY
employee
) AS takenDays ON takenDays.employee = entitled.employee