在MySql插入

时间:2016-10-26 10:11:03

标签: mysql sql join

我会尝试提供一些背景信息,以便您了解我在此尝试实现的目标。我的公司使用开源软件来管理员工离职(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指令中实现所有这一切,但如果更简单或最容易管理/理解,它也可以分成更多。

非常感谢提前。

1 个答案:

答案 0 :(得分:2)

这是您处理计算的方法:

  • 通过将每个员工在其表中的数据集分组来对子查询中的授权日进行求和
    • 甚至可能一年又一年?在这种情况下,我刚刚通过WHERE - 条款
    • 过滤了2016年
  • 通过对每个员工进行分组,对子查询中的假期进行求和
    • 按年份分组或直接过滤您需要的
  • 将此子查询加入另一个查询的其他结果集
  • 在外部查询
  • 中计算(名为days - take leaves)

<强>查询:

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