【问题标题】:MYSQL | Subtract one field from another but 1 field is created of subqueryMYSQL |从另一个字段中减去一个字段,但 1 个字段是由子查询创建的
【发布时间】:2015-02-14 09:39:54
【问题描述】:
SELECT 
E.`employee_id`,
E.`full_name`,
LE.`no_of_leaves` AS AllocatedLeaves,
MLLT.`leave_type` AS LeaveTypeName,
(SELECT COUNT(*) FROM leave_approval WHERE employee_id = 1 AND MONTH(approval_date) = 11 GROUP BY approval_date) AS TotalLeavesTaken,
LE.`no_of_leaves` - TotalLeavesTaken AS Balance
FROM employee E
INNER JOIN leave_entitlement LE
ON E.`employee_id` = LE.`employee_id`
INNER JOIN `ml_leave_type` MLLT
ON MLLT.`ml_leave_type_id` = LE.`ml_leave_type_id`
LEFT JOIN leave_approval LA
ON E.`employee_id` = LA.`employee_id`
LEFT JOIN leave_application LAPP
ON LAPP.`application_id` = LA.`leave_application_id`
LEFT JOIN ml_leave_type MLLTLA
ON MLLTLA.`ml_leave_type_id` = LAPP.`ml_leave_type_id`

Error Code: 1054
Unknown column 'TotalLeavesTaken' in 'field list'

这是我尝试做的,但出错了..

LE.`no_of_leaves` - TotalLeavesTaken AS Balance

我不擅长数据库,我必须从另一个字段中减去一个字段,第一个字段没问题,但第二个字段是作为子查询生成的。我不想再次运行子查询,是否有可能在不再次使用子查询的情况下进行减法??

【问题讨论】:

    标签: mysql sql select count group-by


    【解决方案1】:

    您需要将计算总叶数的计算移到派生表中,而不是子查询,以便在查询的其他地方再次使用它。

    此外,子查询本身看起来有问题,您确定要将其与实际员工相关联吗?而且我不确定你对 group by 的意图,所以我省略了它。

    SELECT 
      E.`employee_id`,
      E.`full_name`,
      LE.`no_of_leaves` AS AllocatedLeaves,
      MLLT.`leave_type` AS LeaveTypeName,
      lt.TotalLeavesTaken as TotalLeavesTaken,
      LE.`no_of_leaves` - lt.TotalLeavesTaken AS Balance
    FROM employee E
      LEFT JOIN
      (
        SELECT COUNT(*) AS TotalLeavesTaken
         FROM leave_approval 
         WHERE employee_id = E.`employee_id` AND MONTH(approval_date) = 11 
       ) AS lt -- GROUP BY approval_date doesn't make sense to me
      INNER JOIN leave_entitlement LE
        ON E.`employee_id` = LE.`employee_id`
      INNER JOIN `ml_leave_type` MLLT
        ON MLLT.`ml_leave_type_id` = LE.`ml_leave_type_id`
      LEFT JOIN leave_approval LA
        ON E.`employee_id` = LA.`employee_id`
      LEFT JOIN leave_application LAPP
        ON LAPP.`application_id` = LA.`leave_application_id`
      LEFT JOIN ml_leave_type MLLTLA
        ON MLLTLA.`ml_leave_type_id` = LAPP.`ml_leave_type_id`
    

    【讨论】:

    • 遇到错误先生,Error Code: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 0, 1000' at line 25
    • 嗯,我们的两个查询中都没有LIMIT。您可以将示例发布到SqlFiddle 吗?我想这里的另一个问题是COUNT()ing 休假的数量可能也不是有意的——你可能想总结实际的休假天数?当然,除非 leave_approval 每天占用一行。
    【解决方案2】:

    试试这个:

    SELECT E.employee_id, E.full_name, LE.no_of_leaves AS AllocatedLeaves,
           MLLT.leave_type AS LeaveTypeName,
          (LE.no_of_leaves - SUM(CASE WHEN LA.employee_id = 1 AND MONTH(LA.approval_date) = 11 THEN 1 ELSE 0 END)) AS balance
    FROM employee E
    INNER JOIN leave_entitlement LE ON E.employee_id = LE.employee_id
    INNER JOIN `ml_leave_type` MLLT ON MLLT.ml_leave_type_id = LE.ml_leave_type_id
    LEFT JOIN leave_approval LA ON E.employee_id = LA.employee_id
    LEFT JOIN leave_application LAPP ON LAPP.application_id = LA.leave_application_id
    LEFT JOIN ml_leave_type MLLTLA ON MLLTLA.ml_leave_type_id = LAPP.ml_leave_type_id
    GROUP BY E.employee_id;
    

    编辑

    如果您想按员工计算休假余额

    SELECT E.employee_id, E.full_name, LE.no_of_leaves AS AllocatedLeaves,
           MLLT.leave_type AS LeaveTypeName, LA.TotalLeavesTaken, 
          (LE.no_of_leaves - LA.TotalLeavesTaken) AS balance
    FROM employee E
    INNER JOIN leave_entitlement LE ON E.employee_id = LE.employee_id
    INNER JOIN ml_leave_type MLLT ON MLLT.ml_leave_type_id = LE.ml_leave_type_id
    LEFT JOIN (SELECT LA.employee_id, COUNT(1) As TotalLeavesTaken 
               FROM leave_approval LA 
               WHERE MONTH(LA.approval_date) = 11 
               GROUP BY LA.employee_id
             ) AS LA ON E.employee_id = LA.employee_id
    LEFT JOIN leave_application LAPP ON LAPP.application_id = LA.leave_application_id
    LEFT JOIN ml_leave_type MLLTLA ON MLLTLA.ml_leave_type_id = LAPP.ml_leave_type_id
    GROUP BY E.employee_id;
    

    【讨论】:

    • 谢谢您,先生,您的快速响应。但根据最后一个答案。 SUM 没有给出准确的答案。因为在我的表中重复了很多行因为连接。您的解决方案似乎非常好,因为我不必在里面写另一个查询。我已经尝试过你的解决方案,但不幸的是我得到了错误的结果。如果它会起作用,我会喜欢你的解决方案。
    • 不,我想为每个员工扣除假期,因为每个员工都有自己的假期。我的意思是 emp1 已经分配了 10 个叶子,然后他确实需要 3 个叶子,那么 emp1 的 7 个叶子将保持平衡。和其他员工将有自己的分配休假和总休假。
    猜你喜欢
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多